Releases: Life-Experimentalist/Code-Ledger
Releases · Life-Experimentalist/Code-Ledger
CodeLedger v1.4.4
Fixed
- CWS rejection: remotely-hosted code — Chrome Web Store rejected this build for referencing \cdn.jsdelivr.net/chart.js\ in \handlers/git/github/pages-template.js. Chart.js 4.5.1 UMD source is now bundled in \src/vendor/chart-source.js\ and inlined into the generated GitHub Pages dashboard HTML. No remote requests are made by the extension.
- Manifest: \web_accessible_resources\ missing UI modules — \ui/floating-ai.js, \ui/floating-timer.js, and \ui/components/AIMarkdownRenderer.js\ were incorrectly omitted in the v1.4.3 permission tightening pass.
- *CI: release workflow read deleted \src/manifest.json* — Now reads \src/manifest-chromium.json.
Changed
- Build: chart-source auto-regeneration — \dev/build.js\ auto-regenerates \chart-source.js\ when missing or version-mismatched. No manual vendor step after upgrading \chart.js.
- Manifest permissions tightened — Removed unused \scripting, \webRequest, \ abs. Removed \�itbucket.org\ host permission. WAR matches narrowed to DSA platforms + landing page.
- Landing page — Updated to v1.4.3; footer links to /privacy, /terms, /support.
- Prettier standardised — \src//*.js, \dev//.js, \worker/src/**/.js\ formatted.
Added
- Landing pages: Privacy, Terms, Support — Served from Cloudflare Worker.
- CI: Chrome Web Store auto-publish — .github/workflows/publish-chrome.yml\ triggers on release published.
See CHANGELOG.md for full details.
v1.4.3
[1.4.3] — 2026-06-05
Fixed
- Conflict Resolution Modal: Banner persists after resolve — After applying resolved conflicts, the amber "conflicts detected" banner now clears immediately. Previously
_pendingConflictswas zeroed in storage but the React settings state was not updated, so the banner remained until the next full reload.
CodeLedger v1.4.2
Added
- Analytics: Monthly activity chart — AnalyticsView now shows a rolling 12-month bar chart of solve activity alongside the existing weekly chart.
- Analytics: Day-of-week heatmap — New bar chart showing which day of the week you solve most; peak day is highlighted and surfaced as a "Best Day" stat.
- Analytics: Rolling 7/30-day counts —
last7Daysandlast30Daysreplace the previous calendar-week/month counters so the numbers always reflect a true rolling window. - Floating AI: Guided (Socratic) mode — Default panel mode now leads the learner through questions instead of handing over the answer. A "Guided / Direct" toggle chip in the panel header lets you switch modes; selection is persisted to storage.
- Floating AI: Apply-code button — AI-suggested code blocks now render an "Apply" button that writes the code directly into the active Monaco editor without copy-paste.
- Floating AI: Alt+` keyboard hint — Keyboard shortcut hint displayed in the panel title bar.
- Floating AI: Improved Monaco code extraction —
getActiveCodeEditor()is tried first, thengetEditors(), thengetModels(), then DOM view-lines sorted bytopCSS value for correct ordering; covers all LeetCode editor states. - Conflict Resolution Modal: SameCodeStep — When both versions have identical (normalised) code, the modal shows a compact three-way choice (local / remote / both) with an 8 s auto-resolve countdown and progress bar.
- Conflict Resolution Modal: DiffApproachStep — When code differs the modal shows a three-way choice with per-side metadata (difficulty, language, date, AI review status, tag count) and the fields that differ.
- PanelAI: Queue management controls — Settings → AI now polls and displays real-time review queue stats; exposes "Queue Missing Reviews", "Requeue All", and "Cancel" actions.
- AIReviewPanel: QueueStatusCard — Inline status card in the review panel shows queue depth, snail-mode pause state, and time-to-next-batch.
- Service worker: Snail Mode state — Persistent
snailModestate (lastBatch,consecutiveErrors,isPaused,pausedUntil,totalProcessed,totalErrors) tracks AI review batch throttling across browser restarts. - Popup: settingsTab deep-link —
openLibrary()accepts asettingsTabparameter to deep-link directly to a Settings sub-panel from the popup. - DedupReviewQueue: "Let AI Decide" action — Per-conflict button that requests an AI comparison and auto-resolves within 10 s timeout; default countdown reduced from 12 s to 5 s.
Fixed
- AI prompts: chatMode respected —
buildConversationSystemPrompt()now switches to the direct-answer prompt whencontext.chatMode === "direct", preventing Socratic rules from leaking into Direct mode sessions. - Floating AI: DOM line sort — View-lines are now sorted by
style.topbefore joining, fixing incorrect line ordering when code spans the visible scroll window.
See CHANGELOG.md for full details.
CodeLedger v1.3.1
[1.3.1] — 2026-05-19
Fixed
- Auto AI review not triggering —
_requestAIReviewflag was set on the local submission object but never included in theemitSolved()payload; the service worker always sawundefinedand skipped the review. Flag is now forwarded correctly. - "Sync to Ledger" false positive — clicking the button while auto-sync was in progress caused
_processSubmissionto exit early due to_processingLock, but_manualSyncstill showed "✓ Synced". The button now waits up to 8 s for the in-progress sync to finish before reporting "✓ Auto-synced", and only shows "✓ Synced" when_processSubmissionactually emitted a solve event. - Floating AI panel position — panel was anchored at
bottom: 110px, sitting high above the window bottom. Moved tobottom: 20pxto sit at the bottom edge. - AI system prompt context dropped —
buildConversationSystemPrompthad a deadreturn basestatement that prevented the context hints array (problem title, difficulty, request-type behaviour modifiers like "Return useful tests" for/test) from ever reaching the system prompt. - QoL copy/paste buttons lost on React re-render — LeetCode's React occasionally re-mounts the editor toolbar, silently removing injected buttons. A
_maybeReinjectQoL()check is now wired to the existing MutationObserver so buttons are restored within ~600 ms of being removed.
Added
- Monaco language detection in AI panel —
_getEditorLanguage()reads the language frommonaco.editor.getModels()[0].getLanguageId()and maps it to a human-readable name (e.g.python3→Python3). Language is now passed to the floating AI context so code blocks include the correct syntax identifier. - Problem statement auto-injected into AI panel context —
_readProblemStatement()reads the problem description from the DOM ([data-track-load="description_content"]) and passes it asproblemStatementin the AI chat context, giving the AI full problem context without the user needing/problem.
See CHANGELOG.md for full details.
CodeLedger v1.3.0
[1.3.0] — 2026-05-17
Added
- Per-method AI review — each code approach in a multi-method problem gets its own AI review.
MethodCardrenders per-method code + AI review inline in the Methods tab of ProblemModal. Clicking "Generate Review" triggers an immediate on-demand review for that method alone. - Per-method AI review queue —
handleQueueAllAIReviewsnow enqueues${problemId}::method::${index}entries for methods without a review.processAIReviewQueuedetects the::method::pattern and processes them separately from problem-level reviews. - MAINTENANCE_COMMIT alarm — every 10 minutes the service worker batches all pending AI reviews, metadata edits, and notes updates into a single atomic chore commit instead of one commit per edit.
- Bulk import resilience — individual-mode sync (onboarding commit-per-problem) persists its state to
chrome.storage.local. If the browser closes mid-import, aBULK_IMPORT_RESUMEalarm fires 45 seconds after the next browser open to automatically resume. - Onboarding progress bar — the "done" step of GitHubOnboardingModal now shows a live progress bar (current/total) streamed from the SW via a
sync-keepaliveport. "Start Coding" is always enabled; the user can close the modal and sync continues in the background. - Refresh README Stats button — new button in Settings → Git that commits a fresh
index.jsonand triggers a full infra rebuild (README + index.html) from current local data, without needing a new problem commit. Useful after repo recreation or when stats are stale. - Config backup in every commit — every problem commit and every resync now bundles
.codeledger/sync.json(portable settings),.codeledger/behaviour-bank.json, and.codeledger/roadmaps.jsoninto the same atomic tree, keeping user configuration always in sync with the latest solve. GitHub's Trees API deduplicates unchanged blobs so there is no overhead when nothing changed. - Collapsible hints in problem README —
buildProblemMarkdown()now emits a<details><summary>Hint N</summary>block for each hint stored on the problem. Hints are collapsed by default and work in both GitHub's file view and raw markdown. - Canonical path resolution at commit time —
_handleResyncAllInnerpre-loads the canonical map and enriches each problem with its canonical ID before building file paths. Problems previously committed without canonical (e.g., via bulk importer) are now placed underproblems/{canonicalId}/{platform}/on resync. - Two-phase resync with stable commit history —
_handleResyncAllInnernow categorises problems intonewProblems(never committed) andmaintenanceItems(committed but layout/content drifted). Phase A commits only new problems (individual backdated or bulk). Phase B issues a single maintenance commit that atomically writes new-layout files and deletes stale old paths viaopts.deletes→ GitHub Trees APIsha: null. Each problem appears in history exactly once for its initial solve; all subsequent path renames or content updates land in a single maintenance commit per sync cycle — no duplicate commits, no orphaned files. _committedPathstracking — after every commit (regular solve, resync, maintenance) the problem's committed file paths are stored in IndexedDB. Future resyncs use these to compute the exact deletion set instead of guessing.- Remote file tree inference — on resync,
GET /git/trees/{sha}?recursive=1fetches the full repo tree once._inferCommittedPaths()matches problem directory prefixes (including::submissionId-style old paths) to locate all blobs belonging to a problem, enabling correct deletions even for problems committed before_committedPathstracking started. - Landing page library links —
data-cl-openadded to the nav Library link and the CTA button;landing.jsalready rewrites these to the extension URL when the extension is detected. - Landing page platform icons — LeetCode, GeeksForGeeks, and Codeforces chips now use actual favicons instead of emoji.
Changed
- Problem description file renamed to README.md —
descriptionPath()now returns{dir}/README.mdinstead of{dir}/{platformId}.md. GitHub automatically renders this when browsing the problem directory. - Infra bundled into the last meaningful commit —
index.json,README.md,index.html, and.codeledger/*are included in whichever commit is already happening (last problem commit in individual mode, the bulk commit, the maintenance commit). No separate trailing infra commit is issued when problem commits are made. An infra-only commit is still issued when all problems are already up-to-date. - GitHub Pages "src" link uses v3 path —
repoFileUrl()now reconstructs the correct v3 path (problems/{canonicalId}/{platform}/README.mdorproblems/{platformId}/README.md) instead of the old v1 slug-based format. - Language label normalization on GitHub Pages —
pythondata→ "Python (Pandas)",mysql→ "MySQL",postgresql→ "PostgreSQL", etc., for cleaner display in the Recent Solves table and badges. - Recent Solves date includes year — dates in a prior year now display as "Jan 5, 2024" instead of "Jan 5" to avoid ambiguity.
- Removed AI "Progress Summary" from README — the AI-generated narrative block is no longer included in the generated repository README; it produced inconsistent output and added noise.
- Welcome page — removed the Diagnostics & Migration tab and
DiagnosticsPanelcomponent. Path fixes and the two-phase resync make manual layout repair tools unnecessary.
Fixed
::submissionIdsuffix in problem paths —platformId()now strips the::numbersuffix that the LeetCode bulk importer appended (e.g.lc-best-time-to-buy-and-sell-stock::1427680302→lc-best-time-to-buy-and-sell-stock). Affected paths are corrected on the next resync via the maintenance commit.- Stale README stats (one-commit-lag) —
buildInfraFilesnow accepts anindexMetaOverrideparameter. Callers pass the freshly-builtindex.jsondata so README stats reflect the new problem count in the same commit rather than the previous state. - Stale paths not deleted on layout change — old problem files (
{slug}.md,::submissionIddirs, pre-canonical paths) are now explicitly deleted in the maintenance commit viaopts.deletes, eliminating orphaned files that accumulated across layout versions. - GitHub App
read:org401 —/user/orgsreturns 401 for GitHub App tokens that lackread:orgscope. The onboarding modal now silently treats this as an empty org list instead of clearing the valid auth token. - Avatar CORS failure — removed the
Authorizationheader from avatar CDN fetches inlibrary.js;avatars.githubusercontent.comis a public CDN that blocks auth headers via CORS. - LaTeX rendering —
\times,\leq,\geq,\neq,\rightarrow, Greek letters, and other LaTeX symbols are now substituted to Unicode in AI review output viasubstituteLatex()inkatex-stub.js. Applied in bothrenderMath()and inlineparseMarkdown(). - ProblemModal null notes crash — the Notes tab
showguard now usesp?.notessafe navigation, preventing a crash whenpis null during modal initialisation. - AI review batch size — background queue processes 2 items per alarm tick (was 10) to avoid rate-limiting AI providers during backfill.
- On-demand AI review no longer commits immediately —
handleRegenerateAIReviewmarks the problem as pending for the MAINTENANCE_COMMIT batch instead of making an individual commit per review.
See CHANGELOG.md for full details.
CodeLedger v1.2.0
[1.2.0] — 2026-05-13
Added
- 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 asskippedin 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-cellCSS variable set by aresizeHeatmap()function (minimum 8 px); re-runs on every window resize. - User repo README — social banner, logo & badges — generated
README.mdnow 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.jsonwith 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}.mdwith 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.jsonin 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.jsfinds same-slug same-language duplicates;ai-deduplication.jsgenerates AI merge proposals stored on the problem. A dedicatedDedupReviewQueuemodal 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), andinfra-builder.js(README/index.html generation) extracted from the monolithicgithub/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 —
.prettierrcconfig;npm run formatscript formats allsrc/**/*.jsandworker/public/assets/**/*.jsfiles. - 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). - Commit taxonomy — structured commit messages:
[solved],[update],[comprehensive-update],[maintenance],[chore],[init]viasrc/core/commit-messages.js. - 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_REPOmessage for layout v1→v2 migration,RESET_REPOfor full repo rebuild (self-healing). Finds oldtopics/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.versionagainst stored version; setsextensionUpdatedflag 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.htmland rootREADME.mdalways regenerated on every GitHub commit (no longer "only if missing"). GitHub Trees API deduplicates unchanged blobs automatically.index.jsonlayout stats — now includeslayoutVersion,byPlatform, andbyLangbreakdown fields.- Root
README.mdgenerated in user repos linking to their GitHub Pages stats dashboard (supports custom domains). - Under Construction badge in settings section renderer — sections with
underConstruction: trueshow 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.alarmsso 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
setTimeoutretry with aMutationObserverthat 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.jscopy button now uses the Monaco model API as primary source, getting the full file regardless of scroll position; DOM.view-linescraping 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+00B7middle dot,U+200CZWNJ,U+00A0NBSP) 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 dynamicawait import(...)calls insideservice-worker.jsremoved 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, andpath-builder.js. Fixes "Queue AI Reviews" and "Backup" features that were silently failing in production.- AI Review Queue — IndexedDB version conflict —
ai-review-queue.jswas 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.apiFetchnot a function in PanelGit.js — two call sites replaced with a direct call toghGetCurrentUser(token)from the statically importedapi-client.js. Fixed the manual import preview and individual-sync path whengithub_ownerwas 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.jsonshowing 0 problems after full sync — a repair commit is now issued when the remote index contains an emptyproblems: []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. /errorscommand in AI assistant always showed "no errors" — raw error string fromreadTestFailures()now passed directly toexpandChatVariables, bypassingnormalizeList()which was converting the string to[].- Manual sync blocked by submission dedup — `forceCommit:...
CodeLedger v1.1.0
See CHANGELOG.md for full details.
[1.1.0] — 2026-05-07
Added
- Syntax highlighting in the Code tab of ProblemModal — regex-based tokenizer for Python, JavaScript, TypeScript, Java, C++, C, Go, Rust, Kotlin, Swift; keywords in blue, strings in green, comments in gray, numbers in amber, types in purple.
src/lib/syntax-highlight.js— new module withhighlightCode(code, lang)andcleanCode(code)helpers; no external dependencies, works inside the extension's strict CSP.- Mermaid diagram rendering via mermaid.ink — renders diagrams as images without loading external scripts (previously blocked by extension CSP). Includes a "View in Mermaid Live" fallback link.
- Vertical-first Mermaid layout — flowcharts and graph diagrams without an explicit direction, or with LR/RL, are automatically rewritten to TD (top-down) for more readable AI-generated diagrams.
- Extension handshake v2 —
presence-marker.jsnow dispatches aCODELEDGER_HANDSHAKECustomEvent (in addition to the existing DOM marker) carrying the browser-specificchrome-extension:///moz-extension://library URL. Works on Chrome, Edge, Brave, and Firefox. - Session-persistent install detection —
landing.jscaches the handshake insessionStorageto avoid the "flash of install link" on page refresh. - Firefox + all Chromium support for the handshake:
presence-marker.jsusesbrowser.*when available, falls back tochrome.*. AICommandPalettescroll — pressing ArrowDown/ArrowUp now scrolls the active item into view inside the dropdown list.- Landing page improvements
- Browser badges (Chrome/Brave/Edge, Firefox, GitHub Releases) dynamically linked from
config.json - FAQ section (8 questions covering privacy, AI, platforms, BYOK)
- Stats strip (platforms, AI providers, servers that see your code = 0)
- JSON-LD structured data (
SoftwareApplication) for better search indexing - Extended Open Graph and Twitter Card metadata
- Extension-detected indicator ("Extension installed and ready") badge
- Data attributes (
data-cl-show-when-installed,data-cl-hide-when-installed) for dynamic UI based on install state - OpenRouter added to BYOK pills
- Browser badges (Chrome/Brave/Edge, Firefox, GitHub Releases) dynamically linked from
Fixed
- Copy issue with whitespace visualization characters — Monaco editor (LeetCode) injects U+00B7 (middle dot) and U+200C (zero-width non-joiner) as visible space indicators.
cleanCode()strips these before display and before writing to clipboard, so copied code is clean. - Mermaid showed only raw code — CDN script injection was blocked by extension CSP; replaced with
mermaid.inkimage approach; code-block fallback now also provides an external link. - Double-escaping in markdown tables — fixed in previous sprint; tables now render properly.
- KaTeX CSP violation — fixed in previous sprint; math blocks render as styled code spans.
Changed
- Extension version bumped to 1.1.0 in
manifest.jsonandpackage.json. mermaid-stub.js— completely rewritten; no longer attempts CDN script injection.presence-marker.js— now dispatches both DOM marker and CustomEvent for maximum reliability.landing.js— extended with sessionStorage caching and CustomEvent listener.index.html— substantially expanded with FAQ, stats, browser badges, and SEO improvements.
[1.0.0] — 2026-04 (Initial Release)
[1.0.0] — 2026-04 (Initial Release)
Added
- Core extension: LeetCode, GeeksForGeeks, and Codeforces platform handlers
- GitHub integration via OAuth + Trees API (atomic multi-file commits)
- AI code review (Gemini, OpenAI, Claude, DeepSeek, Ollama, OpenRouter)
- Problem library (extension sidebar + standalone web app)
- Analytics dashboard: heatmap, topic radar, difficulty donut, solve velocity, drilldown
- Knowledge graph: force-directed, topic-linked problem network
- Floating AI panel and timer on problem pages
- AI chat with
/mycode,/problem,/errorsslash commands and@platformmentions - Multi-language AI input with command palette dropdown
- Behavior bank for passive interaction tracking (opt-out)
- Settings UI: General, AI, Git, Platforms, Backups, Advanced panels
- Backup system: manual JSON export, scheduled snapshots, on-solve snapshots
- Service worker: solve event pipeline, sync engine, alarm manager
- Cross-device sync via GitHub
index.json - First-run defaults: all AI providers disabled until user adds keys
- Full Chrome + Firefox support via
browser-compat.jsshim