You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
AI Review Queue — Queue Missing button — dedicated button that queues only problems with no AI review yet, separate from the full re-queue action.
AI Review Queue — Requeue All button — queues every problem for re-review (including those already reviewed); asks for confirmation before submitting.
AI Review Queue — Cancel Queue button — gracefully cancels all pending reviews: any review currently processing finishes naturally, then the rest are removed. Button appears only when there are pending or processing items.
AI Review Queue — built-in dedup — enqueueReview() now checks for an existing pending/processing entry before adding; duplicate submissions are silently skipped and reported as skipped in the response.
GitHub Pages heatmap full width — activity heatmap now fills the full card width. Cell size is computed from available width via a --hm-cell CSS variable set by a resizeHeatmap() function (minimum 8 px); re-runs on every window resize.
User repo README — social banner, logo & badges — generated README.md now opens with the CodeLedger social preview image, the extension logo, and four flat-square shields (total / easy / medium / hard counts) with difficulty colours, all using raw GitHub image links.
Auto-save settings to repo — every settings change in the Library UI now calls markSettingsPendingCommit() so the next problem commit automatically includes .codeledger/config.json with the updated portable settings. Manual "Force Commit Settings" and "Backup Config" buttons continue to work as before.
AI Behaviour Bank — personal memory layer for the AI assistant: Knowledge Bank (insights), user-defined Skills (trigger on command/difficulty/after-solve), and a learning Roadmap. All context is automatically injected into AI chat conversations. Accessible as a full Library tab.
MCP Tool-calling — AI assistant can now invoke tools mid-conversation: save/recall Knowledge Bank insights, open problems, set roadmap goals, list and delete chats. Tools are configurable per-provider in Settings → AI.
Cross-device AI chat sync — every AI conversation is committed as chats/YYYY-MM-DD-HH-mm-ss-{id}.md with YAML frontmatter. Bidirectional sync via GitHub on every startup; deleted chats are tombstoned and removed from remote.
Rolling GitHub backups — automatically snapshot local problems + settings to backups/YYYY-MM-DD-HH-mm-ss.json in the repo. Configurable interval (default every 20 commits) and retention count (default 10). Full restore from the Library Settings → Backups panel.
Deduplication engine — duplicate-detector.js finds same-slug same-language duplicates; ai-deduplication.js generates AI merge proposals stored on the problem. A dedicated DedupReviewQueue modal lets users approve/reject proposed merges.
MissingMetadataModal — review queue for problems missing tags or difficulty; supports individual refresh, per-problem ignore, and bulk ignore/unignore with persistent state.
Setup completion notification — Library sidebar and main content area show a dismissable amber banner if GitHub is not connected or no repo is linked, with a direct link to the Welcome page.
Welcome page diagnostic tool — second tab "Diagnostics & Migration" scans the repo for layout version mismatches, missing infra files, and uncommitted problems; offers one-click repair and bulk/individual migration commit.
GitHub handler refactor — commit-builder.js (tree items + commit payload), api-client.js (REST wrappers), and infra-builder.js (README/index.html generation) extracted from the monolithic github/index.js.
Landing page v1.2 — dynamic "Open Library" links (extension URL when installed, web URL otherwise); "What's new in v1.2" features section; new FAQ entries for Behaviour Bank, MCP tools, sync, and migration.
Prettier formatter — .prettierrc config; npm run format script formats all src/**/*.js and worker/public/assets/**/*.js files.
New repository path layout v2 — problems/{slug}/{slug}.{ext} (no platform subdir without canonical); problems/{slug}/{platform}/{slug}.{ext} when canonical is assigned. Solution files named after slug (two-sum.py) instead of verbose language name (Python3.py).
Bulk progress-page import → GitHub — imported problems now build proper v2 paths and READMEs; a "Commit N to GitHub" button appears after import that fires a [comprehensive-update] commit.
Migration manager — MIGRATE_REPO message for layout v1→v2 migration, RESET_REPO for full repo rebuild (self-healing). Finds old topics/ paths and replaces them atomically via GitHub Trees API.
Migration UI in Settings → GitHub — "Check layout version", "Migrate to v2 layout", and "Full rebuild" buttons.
Extension update detection on startup — compares manifest.version against stored version; sets extensionUpdated flag so UI can prompt user to run migration.
Slash-command autocomplete in floating AI assistant — typing / shows a dropdown of available commands; clicking inserts the command.
index.html and root README.md always regenerated on every GitHub commit (no longer "only if missing"). GitHub Trees API deduplicates unchanged blobs automatically.
index.json layout stats — now includes layoutVersion, byPlatform, and byLang breakdown fields.
Root README.md generated in user repos linking to their GitHub Pages stats dashboard (supports custom domains).
Under Construction badge in settings section renderer — sections with underConstruction: true show an amber badge and are visually marked.
Missing Metadata review modal — surfaces problems missing tags/difficulty and queues metadata refresh from the background.
Dedup review queue — same-language duplicate candidates now appear in a dedicated review modal with approve/reject actions.
AI merge proposals — same-language duplicates can generate an AI merge proposal that is stored on the problem and reviewed before applying.
Mirror repository settings — a dedicated settings panel manages additional git mirrors alongside the primary repository.
Cross-device auto-sync — periodic background sync is scheduled with chrome.alarms so remote changes are picked up automatically.
LeetCode: non-accepted submissions could auto-sync — submission detail pages now check statusCode === 10 (Accepted) before auto-committing; WA / TLE / Runtime Error submissions are silently skipped. Manual "Sync to Ledger" still works on any submission.
LeetCode: sync button appearance delay — replaced the 1200 ms setTimeout retry with a MutationObserver that injects the button the instant the action button row enters the DOM; button now appears as soon as the page renders.
LeetCode: Monaco code extraction — added _getCodeFromMonaco() fallback (window.monaco.editor.getModels()[0].getValue()) for cases where GraphQL returns an empty code field.
LeetCode: copy button only copied visible lines — qol.js copy button now uses the Monaco model API as primary source, getting the full file regardless of scroll position; DOM .view-line scraping kept as fallback for edge cases.
LeetCode: copy button produced dirty code — both the copy button and _getCodeFromMonaco() now strip whitespace-visualization characters Monaco injects (U+00B7 middle dot, U+200C ZWNJ, U+00A0 NBSP) so clipboard output is clean, runnable code.
Graph: scroll zoom snaps to min/max — replaced binary 0.9/1.1 zoom step with Math.exp(−deltaY × 0.001), making trackpad pinch-to-zoom smooth and proportional while keeping single mouse-wheel notch at ≈ 9.5 % per step.
Graph: zoom buttons — + and − buttons in the toolbar for click-to-zoom (centered on canvas), grouped with the existing Fit view (▣) button.
Fixed
import() banned in MV3 service workers — all dynamic await import(...) calls inside service-worker.js removed and replaced with top-level static imports. Affected modules: ai-review-queue.js, ai-deduplication.js, backup-manager.js, migration-manager.js, api-client.js, and path-builder.js. Fixes "Queue AI Reviews" and "Backup" features that were silently failing in production.
AI Review Queue — IndexedDB version conflict — ai-review-queue.js was opening a "CodeLedger" database at version 1 while the browser had an existing version 2, causing a hard error on every queue operation. Database renamed to "codeledger-queue" to open fresh at version 1.
git.apiFetch not a function in PanelGit.js — two call sites replaced with a direct call to ghGetCurrentUser(token) from the statically imported api-client.js. Fixed the manual import preview and individual-sync path when github_owner was unset.
422 non-fast-forward on sequential commits — GitHubHandler.commit() now retries up to 3 times (500 ms, then 1 000 ms back-off), fetching a fresh ref and rebuilding the tree on each retry.
Stale index.json showing 0 problems after full sync — a repair commit is now issued when the remote index contains an empty problems: [] but local problems are already committed.
Repo name forced to lowercase — GitHubOnboardingModal.jssanitize() no longer calls .toLowerCase(); the allowed-character regex updated to [^a-zA-Z0-9._-] to match GitHub's actual rules.
/errors command in AI assistant always showed "no errors" — raw error string from readTestFailures() now passed directly to expandChatVariables, bypassing normalizeList() which was converting the string to [].
Manual sync blocked by submission dedup — forceCommit: isManual now bypasses the alreadyCommitted session-storage dedup check so the Sync button always commits.
AI floating panel overlapping LeetCode's submit bar — moved from bottom: 70px to bottom: 110px.
Bulk-imported problems had no READMEs and used old hardcoded topics/ paths — now uses solutionPath() + readmePath() from path-builder and builds a full README per problem.
GitHub avatar showed a placeholder instead of the real profile image — avatar is now hydrated from saved settings on startup and stored as a data URL when OAuth can fetch it.
Console logging was noisy when debug was disabled — console.log / console.error are now gated behind the debug flag and re-enabled cleanly after OAuth.
index.json could throw on malformed remote content — remote sync now guards JSON parsing and falls back to an empty remote index.
providerId could be undefined in the AI review loop — the provider id is now scoped before use and falls back safely.
Changed
AI Review Queue stats display — replaced verbose paragraph list with a compact inline pill row that only shows non-zero counts; processing count highlighted in cyan.
handleQueueAllAIReviews now accepts a missingOnly flag — single function drives both "Queue Missing" and "Requeue All" to avoid duplicating logic.
Shift+Enter inserts newline in AI assistant input (previously single-line <input> — replaced with auto-growing <textarea>).
Solution files named after problem slug (two-sum.py) — solutionPath() no longer uses the verbose language name.
buildIndexJson includes layout version and per-platform / per-language stats.
LeetCode import now preserves every accepted submission — imports keep multiple languages and multiple accepted submissions instead of collapsing them too early.
Atomic chore commits include notes and AI chats — maintenance sync commits now bundle notes.md and ai-chats/*.json alongside problem files.
AI review tags are ordered by importance — tag presentation is now priority-based instead of alphabetical.
Removed
Old topics/{topic}/{slug}/ path pattern — migrated by MIGRATE_REPO.