Proto commits in ankitects/anki

These commits are when the Protocol Buffers files have changed: (only the last 100 relevant commits are shown)

Commit:e758aa0
Author:Luc Mcgrady

Merge remote-tracking branch 'upstream/main' into labs

Commit:643187a
Author:Abdo
Committer:GitHub

Shift editor control to TypeScript (#4029) Closes https://github.com/ankitects/anki/issues/3830 --------- Co-authored-by: Fernando Lins <fernandolins@users.noreply.github.com>

The documentation is generated from this commit.

Commit:0279230
Author:Abdo
Committer:Abdo

Merge remote-tracking branch 'origin' into editor-3830

The documentation is generated from this commit.

Commit:5f386da
Author:Luc Mcgrady
Committer:GitHub

feat: Labs interface backend (#5071) closes #5073 Saves the values set in - #5057 Saves it to the currently open collections json config. I'm not sure if this approach might have problems with https://github.com/ankitects/anki/pull/4289#discussion_r2544738518. A situation where the main window has Anki API access while also displaying user supplied JavaScript would be terrible so we should be careful with this. Test by enabling the "ping" labs option and then reload Anki or switch profile to the same profile.

Commit:3f3fac5
Author:Fernando Lins
Committer:Fernando Lins

Merge branch 'main' of github.com:ankitects/anki into editor-3830

The documentation is generated from this commit.

Commit:83d711f
Author:user1823
Committer:GitHub

Feat: Expose card's decay and DR to custom scheduler (#4880) I wanted to use the card's decay in my custom scheduling script. But, Anki doesn't expose it to JS. This small change exposes the values to JS.

Commit:751e3f5
Author:Andrew Sanchez
Committer:GitHub

Merge branch 'main' into editor-3830

Commit:5a9b54e
Author:Andrew Sanchez
Committer:GitHub

Briefcase Installer (#4629) migrates Anki Desktop packaging from the legacy NSIS/uv-based installer to [BeeWare Briefcase](https://briefcase.readthedocs.io/). This branch integrates work from many related issues and PRs to deliver cross-platform native installers (MSI on Windows, .app on macOS, PyInstaller on Linux) with code signing, notarization, and file association support. ## Integrated PRs - #4585 — Set up Briefcase - #4596 — Add Briefcase icons - #4598 — Handle Briefcase file associations - #4601 — Add Briefcase app permissions - #4609 — Customize Briefcase's MSI installer - #4616 — Set up Briefcase code signing and notarization - #4618 — Fix Briefcase packaging for x86 Macs - #4623 — Customize Briefcase's Linux template - #4627 — List required Debian packages for Briefcase installer - #4630 — Update Briefcase's Windows template - #4631 — Rewrite Linux install/uninstall scripts for PyInstaller - #4638 — Use PyInstaller on Linux - #4645 — Update installer docs - #4654 — Disable Briefcase's universal builds for macOS - #4672 — Deal with existing NSIS installations in MSI installer - #4676 — Remove duplicate Briefcase icons - #4677 — Tweak Linux scripts for new installer - #4709 — Add anki-console.bat to Briefcase's Windows package ## Related Issues - #4557 — Evaluate BeeWare Briefcase for Anki packaging and distribution - #4678 — Support native Windows ARM64 builds for Briefcase - #4688 — Linux installer: migrate to PyInstaller and rewrite install scripts - #4689 — Investigate startup performance with Briefcase - #4690 — Specify required Linux system packages for Briefcase - #4691 — Investigate Windows ARM64 support with Briefcase - #4692 — Test on Linux ARM with Briefcase - #4693 — Separate ARM and Intel macOS releases - #4694 — Update developer documentation for Briefcase installer - #4695 — Support upgrade/downgrade with the Briefcase installer - #4696 — Update user documentation for new installer - #4702 — Update Briefcase's Windows template with upstream security fix and OS version check - #4703 — Follow-up tweaks to Linux install/uninstall scripts ## Related PRs - #4619 — Enable Windows ARM64 support - #4632 — Release action --------- Co-authored-by: Abdo <abdo@abdnh.net> Co-authored-by: Andrew Sanchez <andrewsanchez@users.noreply.github.com> Co-authored-by: Fernando Lins <1887601+fernandolins@users.noreply.github.com>

Commit:8d4a986
Author:Abdo
Committer:GitHub

feat: Support upgrades for Briefcase packages (#4725) ## Linked issue #4695 ## Summary This adds support for app upgrades for Briefcase/PyInstaller packages. This is done by downloading the latest GitHub release (stable or prerelease depending on the user's current version) and opening the installer. ## How to test 1. Change the `ALL_RELEASES_URL`/`LATEST_RELEASE_URL` constants defined in github.rs to reference my fork so you have some recent releases to test with: https://github.com/abdnh/anki/releases 2. Use _Tools > Check for Updates_ and confirm you're prompted to update to 26.04. 3. Accept the prompt and wait for the download to finish and installer to open. If you're on Linux, you'll be redirected to the direct download URL on your browser (extraction/installation is not handled for simplicity). 4. Change .version to `26.04b1` and check for updates again. Confirm you're prompted to update to 26.04b3. ### Checklist - [x] I ran `./ninja check` or an equivalent relevant check locally. - [ ] I added or updated tests when the change is non-trivial or behavior changed. ### Details - Anki's automatic update check is left untouched for now. It fetches the latest release from AnkiWeb, which might (intentionally) lag a few releases behind GitHub. - Updates are downloaded and cached to `updates` under the `AnkiProgramFiles` folder (used for the uv launcher). ## UI evidence The existing prompt is reused: <img width="281" height="182" alt="image" src="https://github.com/user-attachments/assets/d52900b7-645f-4b91-a195-9d5ce016b981" /> <img width="312" height="101" alt="image" src="https://github.com/user-attachments/assets/069f3eba-5f03-4de1-a962-59bbdc6c1e39" /> ## Scope - [x] This PR is focused on one change (no unrelated edits).

Commit:4652d86
Author:Abdo

Merge branch 'main' into editor-3830

Commit:922953a
Author:Luc Mcgrady
Committer:GitHub

Feat/Different method for ratio graph in Help Me Decide. (#4452) Forum link: - https://forums.ankiweb.net/t/replace-cmrr-with-workload-vs-dr-graph-more/63234/27?u=a_blokee @snorpdorp notified me that the logic behind the ratio graph is flawed as it doesn't properly account for the number of cards that are memorized to begin with. I have implemented his (and @1DWalker's) proposed solution <img width="1267" height="657" alt="image" src="https://github.com/user-attachments/assets/41eded79-8f76-41dd-b98f-0bf1a968ab9b" /> Now the graph is inverted so that the higher the value, the more efficient it is, in @snorpdorp's own words: > The previous equation was flawed in that it displayed the total knowledge at the end of the simulation, not the relative gain in knowledge from the amount of studying done during the simulation timeframe. The new (correct) equation is (relative gain in knowledge as a result of studying during the simulation) / (time spent studying during simulation) - https://discord.com/channels/368267295601983490/1443273721878937650/1444447278344437833

Commit:0130fb7
Author:Abdo

Merge branch 'main' into editor-3830

Commit:db81135
Author:user1823
Committer:GitHub

Fix/Make descending R a pure R sort (#4400) * Feat/Add pure R-based review sorting orders https://forums.ankiweb.net/t/follow-up-make-descending-retrievability-a-pure-r-sort/67082 * cleanup * fix * Update test

Commit:7c6fa98
Author:Abdo
Committer:Abdo

Add RPCs for Fields/Cards dialogs

Commit:7dc2d29
Author:Abdo

Handle deeply nested OpChanges Messages such as AddNotesResponse were not handled correctly.

Commit:f10d48d
Author:Abdo

Handle undo for all RPCs that return OpChanges

Commit:28daa16
Author:Abdo

Merge branch 'main' into editor-3830

Commit:d8aa244
Author:user1823
Committer:GitHub

Export last_interval to Python (#4365) * Export last_interval to Python * Add last_interval field to StatsRevlogEntry * Implement last_interval_secs function * Update last_interval field type in stats.proto * Update last_interval to use last_interval_secs

Commit:c56e6e5
Author:llama
Committer:GitHub

feat: show saved custom colours as options in fill tool colour picker on mobile (#4348) * add GetCustomColours rpc method * save colours as rgb instead of argb * show saved custom colours as possible options in colour picker this is primarily for mobile clients, as qt currently ignores this * save custom colours on colour picker change (for desktop)

Commit:80cff16
Author:llama
Committer:GitHub

fix: persist colour picker's custom palette in profile (#4326) * add SaveCustomColours rpc method * restore custom colour palette on editor init * save custom colour palette on colour picker open and input there doesn't seem to be an event fired when the picker is cancelled/closed, so it's still possible for work to be lost * save colours on `change` instead of `input` `input` is supposed to be fired on every adjustment to the picker whereas `change` is only fired when the picker is accepted, but qt seems to treat both as the latter, so this is currently a no-op * Store colors in the collection One minor tweak to the logic while I was there: an invalid color no longer invalidates all the rest. --------- Co-authored-by: Damien Elmes <gpg@ankiweb.net>

Commit:6f93bfa
Author:Abdo

Move retrieve_url to backend

Commit:5280cb2
Author:maxr777
Committer:GitHub

Enable nc: to only search in a specific field (#4276) (#4312) * Enable nc: to only search in a specific field * Add FieldSearchMode enum to replace boolean fields * Avoid magic numbers in enum * Use standard naming so Prost can remove redundant text --------- Co-authored-by: Damien Elmes <gpg@ankiweb.net>

Commit:355e5f2
Author:Abdo

Merge branch 'main' into editor-3830

Commit:153b972
Author:llama
Committer:GitHub

Show the number of cards added when adding (#4310) * modify `generate_cards_for_note` to return count * modify `add_note` to return count * show the number of cards added when adding

Commit:93f3892
Author:Abdo

Merge branch 'main' into editor-3830

Commit:2b55882
Author:Jarrett Ye
Committer:GitHub

Fix/use real step count to simulate (#4240) * Fix/use real step count to simulate * Update licenses.json

Commit:c947690
Author:Luc Mcgrady
Committer:GitHub

Feat/Use cached workload values (#4208) * Feat/Use cached workload values * Fix: Calculation when unchanged * Modify constants * Cache clearing logic * Use function params * use https://github.com/open-spaced-repetition/fsrs-rs/pull/352 * Revert "use https://github.com/open-spaced-repetition/fsrs-rs/pull/352" This reverts commit 72efcf230c273b0eb9f1f294d21e4b9f959e3dde. * Reapply "use https://github.com/open-spaced-repetition/fsrs-rs/pull/352" This reverts commit 49eab2969f56568296289b63b0a7146118d848b3. * ./check * bump fsrs

Commit:1af3c58
Author:Luc Mcgrady
Committer:GitHub

Feat/Desired retention info graphs (#4199) * backend part * split memorised and cost * slapdash frontend * extract some simulator logic * Add zoomed version of graph * ./check * Fix: Tooltip * Fix: Simulator/workload transition * remove "time" * Update ts/routes/graphs/simulator.ts Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * Added: Mode toggle * Disable Dr in workload mode * keep button order consistant between modes * dont clear points on mode swap * add review count graph * Revert "dont clear points on mode swap" This reverts commit fc89efb1d954ce331002b4dd0b464109938b8a35. * "Help me pick" button * unrelated title case change * Add translation strings * fix: missing translation string * Fix: Layout shift * Add: Experimental * Fix Time / Memorized * per day values * set review limit to 9999 on open * keep default at currently set value * Do DR calculation in parallel (dae) Approx 5x faster on my machine --------- Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> Co-authored-by: Damien Elmes <gpg@ankiweb.net>

Commit:46bcf4e
Author:Jarrett Ye
Committer:GitHub

Feat/per-deck desired retention (#4194) * Feat/per-deck desired retention * Refactor desired retention logic in Collection implementation Updated the logic for retrieving deck-specific desired retention in both `memory_state.rs` and `mod.rs` to handle cases where the deck's normal state may not be available. This change ensures that the default configuration is used when necessary, improving the robustness of the retention handling. * Refactor desired retention handling in FsrsOptions.svelte Updated the logic for effective desired retention to use the configuration default instead of the deck-specific value. This change improves consistency in the retention value used throughout the component, ensuring that the correct value is bound to the UI elements. * refactor the logic for obtaining deck-specific desired retention by using method chaining * support deck-specific desired retention when rescheduling * Refactor desired retention logic to use a dedicated method for improved clarity and maintainability.

Commit:9a054d6
Author:Abdo

Complete noteCanBeAdded()

Commit:f379aa7
Author:Abdo

Implement History button

Commit:c91f943
Author:Abdo

Merge branch 'main' into editor-3830

Commit:1f7f7bc
Author:Jarrett Ye
Committer:GitHub

Fix/FSRS simulator fallback to memory_state_from_sm2 when converting cards (#4189) * Fix/FSRS simulator fallback to memory_state_from_sm2 for after setting “Ignore cards reviewed before” * add comment to fsrs_item_for_memory_state * Add historical retention field to FSRS review request and update related logic - Added `historical_retention` field to `SimulateFsrsReviewRequest` in `scheduler.proto`. - Updated `simulator.rs` to use `req.historical_retention` instead of the removed `desired_retention`. - Modified `FsrsOptions.svelte` to include `historicalRetention` in the options passed to the component. * Update rslib/src/scheduler/fsrs/memory_state.rs Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * Update rslib/src/scheduler/fsrs/simulator.rs Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * pass ci * Update rslib/src/scheduler/fsrs/simulator.rs Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * format * Update rslib/src/scheduler/fsrs/simulator.rs Co-authored-by: Luc Mcgrady <lucmcgrady@gmail.com> * format * Fix condition in is_included_card function to check CardType instead of CardQueue --------- Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> Co-authored-by: Luc Mcgrady <lucmcgrady@gmail.com>

Commit:c2374dc
Author:Abdo
Committer:Abdo

Implement help button

Commit:a8a2e4e
Author:Abdo

Implement close button

Commit:b177189
Author:Abdo

Merge branch 'main' into editor-3830

Commit:80ff9a1
Author:llama
Committer:GitHub

Allow creating deck via `#deck:...` if non-existent when importing (#4154) * add deck name field to metadata protobuf msg * fallback to creating new deck specified in `#deck:...` * update tests * create deck if it doesn't exist * plumbing * allow creating deck via `#deck:...` * apply suggestion for protobuf

Commit:037dfa1
Author:Jarrett Ye
Committer:GitHub

Add `last_review_time` to card data for performance and accuracy (#4124) * Add `last_review_time` to card data * cargo clippy * Calculate days elapsed since last review time in add_extract_fsrs_relative_retrievability * expose last_review_time to Card in Python * Fix last_review_time assignment in Card class to use last_review_time_secs * format * Update last_review_time assignment to exclude filtered preview state in Card class

Commit:f5285f3
Author:Luc Mcgrady
Committer:GitHub

Feat/Add legacy evaluate config bool (#4149) * Feat/Add legacy evaluate config bool * Minor tweaks based on PR suggestions (dae) New enabling command: from anki.config import Config mw.col.set_config_bool(Config.Bool.FSRS_LEGACY_EVALUATE, True)

Commit:d0bb1ff
Author:Abdo

Tweak naming

Commit:dbd8737
Author:Abdo

Fix undo ops of add_note/update_notetype

Commit:da90705
Author:Damien Elmes
Committer:Damien Elmes

Re-expose legacy RMSE calculations Closes #4143

Commit:b22b331
Author:Damien Elmes
Committer:Damien Elmes

Revert "Feat/Cmrr target selector (#4116)" This reverts commit ad0dbb563a520baef1a72c0c6b43af845cce8c82. https://forums.ankiweb.net/t/anki-25-06-beta/62271/156

Commit:1f00213
Author:Abdo
Committer:Abdo

Add a basic fieldsAreBlank()

Commit:230fb3c
Author:Abdo

Use CamelCase consistently for Protobuf names

Commit:dd67385
Author:Abdo

Go back to using QClipboard

Commit:5bfae11
Author:Abdo

Merge branch 'main' into editor-3830

Commit:ad0dbb5
Author:Luc Mcgrady
Committer:GitHub

Feat/Cmrr target selector (#4116) * backend * Add: Frontend * us * Added: Loss aversion * change proto format * Added: Loss aversion * Added: Future retention targets * update default fail cost multiplier * Future Retention -> Post Abandon Memorized * superfluous as const * Fix: Wrong default * Fix: Wrong import order

Commit:fa0c4b1
Author:Abdo
Committer:Abdo

Merge branch 'main' into editor-3830

Commit:a4c95f5
Author:Jarrett Ye
Committer:GitHub

include decay in ComputeMemoryStateResponse (#4102) * include decay in ComputeMemoryStateResponse * Add decay attribute to ComputedMemoryState and update Collection methods * Refactor decay calculation into a helper function for improved readability and maintainability in memory state management * format & clippy

Commit:cf099ea
Author:Abdo
Committer:Abdo

Move Record Audio button

Commit:70a69cf
Author:Abdo
Committer:Abdo

Move context menu logic

Commit:13c2dd2
Author:Abdo
Committer:Abdo

Move more image occlusion calls

Commit:99396e5
Author:Abdo

Start work on copy & paste handling

Commit:55ecbc1
Author:Luc Mcgrady
Committer:GitHub

Feat/Health check (#4047) * Message on low log loss * make console.log permanent * Added: Health check option * disable button * change health check conditions * i18n * ./check * Apply suggestions from code review Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * delete shadowed fsrs * Update ts/routes/deck-options/FsrsOptions.svelte Co-authored-by: llama <gh@siid.sh> * Update ftl/core/deck-config.ftl Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * anon's suggestions * snake_case * capital slow * make global * on by default * Adjusted loss values * Show message on pass * ./check * ComputeParamsRequest * update coefficients * update thresholds * fix thresholds * Apply suggestions from code review --------- Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> Co-authored-by: llama <gh@siid.sh> Co-authored-by: Damien Elmes <dae@users.noreply.github.com>

Commit:2de0c79
Author:Jarrett Ye
Committer:GitHub

Feat/evaluate FSRS with time series split (#3962)

Commit:2ee708f
Author:Abdo

Formatting

Commit:15cbbee
Author:Abdo

Move setTagsCollapsed()

Commit:9395b89
Author:Abdo

Move setColorButtons()

Commit:3ae7484
Author:Abdo

Merge branch 'main' into editor-3830

Commit:f29bcb7
Author:Luc Mcgrady
Committer:GitHub

Feat/Desired retention warning improvements (#3995) * Feat/90% desired retention warning * Update ftl/core/deck-config.ftl * show on newly enabled * Show warning on focus * Never hide warning * Display relative change * Add: Separate warning for too long and short * Revert unchanged text changes * interval -> workload * Remove dead code * fsrs-rs/@L-M-Sherlock's workload calculation * Added: delay * CONSTANT_CASE * Fix: optimized state * Removed "Processing" * Remove dead code * 1 digit precision * bump fsrs-rs * typo * Apply suggestions from code review Co-authored-by: Damien Elmes <dae@users.noreply.github.com> * Improve rounding * improve comment * rounding <1% * decrease rounding precision * bump ts-fsrs * use actual cost values * ./check * typo * include relearning * change factor wording * simplify sql * ./check * Apply suggestions from code review Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * Fix: missing search_cids * @dae's style patch * Fix: Doesn't update on arrow keys change * force two lines * center two lines --------- Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com>

Commit:3073ef0
Author:Abdo

Remove editorReady() bridgeCommand() looks cleaner here

Commit:1809e79
Author:Abdo
Committer:Abdo

Move note saving to TS

Commit:5cbb524
Author:Abdo

Move editor code to ts/routes

Commit:48a0640
Author:Damien Elmes

Revert "feat(scheduler): add from_queue flag to CardAnswer (#3976)" This reverts commit 1f95d030bbc7ebcc004ffe1e2be2a320c9fe1e94. Buggy: https://github.com/ankitects/anki/pull/3983

Commit:1f95d03
Author:Yaoliang Chen
Committer:GitHub

feat(scheduler): add from_queue flag to CardAnswer (#3976) Co-authored-by: Yaoliang <yaoliang.ch@gmail.com>

Commit:ad073ab
Author:Luc Mcgrady
Committer:GitHub

Feat/CMRR uses simulate config (#3947) * Added: simulate_request_to_config * Use SimulateConfig for CMRR * ./check * Fix: ComputingRetention * Use actual cards for optimal_retention

Commit:e096c46
Author:Jarrett Ye
Committer:GitHub

Feat/FSRS-6 (#3929) * Feat/FSRS-6 * update comment * add decay to Card * ./ninja fix:minilints * pass check * fix NaN in evaluation * remove console * decay should fallback to 0.5 when it's None. * Update SimulatorModal.svelte * Update a few comments * Update FSRS decay defaults to use constants for better maintainability and clarity * Update rslib/src/storage/card/data.rs

Commit:efaaae8
Author:Arthur Milchior
Committer:GitHub

Cloze button get disabled outside of cloze field (#3879) * NF: replace `disabled` by `enabled` This allows to remove the negations and, in my opinion, make the code easier to understand and edit. * Cloze button get disabled outside of cloze field More specifically, if the user focus in a field that is not a cloze field, the button are still there but appear as disabled. The shortcut instead of adding the cloze context shows an alert explaining why this can't be done. While this message is already displayed when the user tries to add a note with cloze in non-cloze field, I suspect it will save time to stop the user as soon as possible from making mistake. This should make very clear what is authorized and what is not. It'll also be a reminder of whether the current field is a cloze or not. In order to do this, I added a back-end method (that I expect we may reuse in ankidroid) to get the index of the fields used in cloze. This set is sent to the note editor, which propagates it where needed. In mathjax, the cloze symbol is removed when the selected field is not a cloze field.

Commit:781a23c
Author:Luc Mcgrady
Committer:GitHub

Feat/Ignored before card count (#3910) * GetIgnoredBeforeCount * get_card_count_with_ignore_before * Included / total * Respect search * Get frontend hooked up * Fix: Malformed sql and search * Variable names * Added: Alert colours * i18n * ./check * Remove console.log * Fix: Tooltip showing for default value * Update ftl/core/deck-config.ftl Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * Fix: Multiple backend calls * Message: (Approximately) * Fix: Bouncing info message * Added: Change delay * Added: ignore_before_updated * ./check * Fix typing, camelCase and improve wording * Temporarily enable the check on startup --------- Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com>

Commit:ccab18b
Author:llama
Committer:GitHub

Modify card rendering output to specify if rendered card is empty (#3890) * modify render_card to return whether card was empty * plumbing * add flag to proto message * plumbing: pass flag along to PartiallyRenderedCard * add tests * Use a custom return type for clarity (dae)

Commit:acdf486
Author:Yuki
Committer:GitHub

Refactor: Make Load Balancer Optional Throughout Codebase (#3860) * Refactoring: load balancer * Update about.py * Refactoring: load balancer * Update about.py * Clean the code * Remove config check from get_scheduling_states * Backend method for the load balancer * Refactor backend method for the load balancer

Commit:0e31efa
Author:Jarrett Ye
Committer:GitHub

Feat/grade now (#3840) * Feat/grade now * pass ci * fix from_queue * Refactor card answering to support from_queue flag - Add `from_queue` field to `CardAnswer` struct and proto message - Modify `answer_card_inner` to handle queue updates based on `from_queue` - Remove `grade_card` method and consolidate card answering logic - Update related test cases to set `from_queue` flag * fix current_changes() called when no op set * Optimize queue updates for batch card processing - Refactor `grade_now` to collect processed card IDs first - Add new `update_queues_for_processed_cards` method for efficient batch queue updates - Improve queue management by removing entries and updating counts in a single pass - Remove individual queue update method in favor of batch processing * pass ci * keep the same style * remove ineffective code * remove unused imports

Commit:79b6f65
Author:Luc Mcgrady
Committer:GitHub

Feat: Simulator suspend after lapse count (#3837) * Added: Leech suspend to simulator * Added: leech threshold spin box * Update git rev * Added: Save to preset options * ./check * Added: "Advanced settings" dropdown * Removed: Indent * Added: Easy days * Added: Sticky header * Removed: Easy Day updating without saving * un-nest disclosure * bump fsrs * Update a VSCode setting to match recent releases * Move Easy Days above the Advanced settings I think it's a bit more logical to have Advanced come last. * Ensure graph fits inside screen height * Bump fsrs version

Commit:a6426be
Author:Jarrett Ye
Committer:GitHub

Feat/support load balance and easy days in FSRS simulator (#3829) * Feat/support load balance and easy days in FSRS simulator * format * consider LoadBalancerEnabled * use fsrs::PostSchedulingFn * add load balance and easy days to compute_optimal_retention * move simulator to a pop-over * fix incorrect simulationNumber when error 500 * Feat: Save to Preset Options * update tabs when update newPerDay & reviewsPerDay * don't reset deckSize & daysToSimulate when save options * fix missing easy days * plan to support review priority * Fix graph line rendering with non-scaling stroke * simplify review priority function with helper wrapper * fallback to default ReviewPriority for Added & ReverseAdded * Update ts/routes/deck-options/SimulatorModal.svelte Co-authored-by: Luc Mcgrady <lucmcgrady@gmail.com> * Wrap review priority function in Arc for thread-safe sharing * more granularity for R sorting * Add graph smoothing option to FSRS simulator * Improve graph resize handling in FSRS simulator * simplify review priority calculation * Add review order selection to FSRS simulator modal * Refactor review priority function using macro for conciseness * Add copyright and license header to SimulatorModal.svelte * cargo clippy * ./ninja fix:eslint * update fsrs-rs * Update FSRS dependencies and refactor load balancing functions - Update fsrs-rs dependency to latest commit - Modify retention and simulator modules to use Arc instead of Box - Update function signatures and imports in simulator module - Simplify review card order handling with direct enum usage * resolve reviewed changes * replace .unwrap() with ? * move simulating into SimulatorModal * add (crate) to interval_to_weekday * Update FsrsOptions.svelte * format --------- Co-authored-by: Luc Mcgrady <lucmcgrady@gmail.com>

Commit:43e8607
Author:Jarrett Ye
Committer:GitHub

Fix/re-optimize FSRS if short-term param is weird (#3742) * Fix/re-optimize FSRS if short-term param is weird * Reset progress when another run is required (dae) * only count the same-day steps * Fix flicker when optimizing again (dae)

Commit:1b5b685
Author:Damien Elmes

Remove unused proto import

Commit:b6d7bb1
Author:llama
Committer:GitHub

Fix IO editor always starting in "hide all, guess one" mode (#3709) * update backend * set hideAllGuessOne in mask editor instead

Commit:c4ad27a
Author:Jarrett Ye
Committer:GitHub

Feat/support new cards ignore review limit in simulator (#3707) * Feat/support new cards ignore review limit in simulator * ./ninja fix:minilints & ./ninja format * use published crate * make newCardsIgnoreReviewLimit reactive * format --------- Co-authored-by: Damien Elmes <gpg@ankiweb.net>

Commit:d7fc98d
Author:Arthur Milchior
Committer:GitHub

Deck options without bridge (#3571) * NF: Modify CONTRIBUTORS Just so that I stop getting the warning * NF: Create `deckOptionsReady` * NF: rename _close to require_close The method will have to be used outside of this class, so can't be private * NF: simplify slightly some code * NF: remove bridge command from deck options * Remove unused import * Remove superfluous comment with a typo

Commit:cee04bf
Author:OuOu2021
Committer:GitHub

Apply gradient effect to forgetting curve (#3604) * Add gradient color for forgetting curve * Add desiredRetention prop for CardInfo * update CONTRIBUTORS * Formatting * Tweak range of gradient * Tweak: salmon -> tomato * Get desired retention of the card from backend * Add a reference line for desired retention * Fix: Corrected the steel blue's height & Hide desired retention line when yMin is higher than desiredRetentionY * Add y axis title * Show desired retention in the tooltip * I18n: improve translation and vertical text display * Revert rotatation&writing-mode of vertical title * Tweak font-size of y axis title * Fix: delete old desired retention line when changing duration * Update ftl/core/card-stats.ftl --------- Co-authored-by: Damien Elmes <dae@users.noreply.github.com>

Commit:01c3686
Author:Damien Elmes

Remove remaining remnants of unused error; fix CI

Commit:ba1f5f4
Author:Damien Elmes
Committer:Damien Elmes

Flag server messages so AnkiDroid can handle them separately

Commit:b646f09
Author:Damien Elmes
Committer:GitHub

Add descending retrievability (#3559) * "relative overdueness" -> "retrievability ascending" * Add 'retrievability descending'

Commit:6adbd92
Author:Damien Elmes
Committer:Damien Elmes

Rename remaining 'weights' references to 'params'

Commit:c45fa51
Author:Damien Elmes
Committer:Damien Elmes

Use separate field to store FSRS params Will allow the user to keep using old params with older clients

Commit:26ae51f
Author:Jarrett Ye
Committer:GitHub

Create a new kind of revlog entry for reschedule cards on change (#3508) * create a new kind of revlog entry for Reschedule cards on change * add comments * exclude the rescheduled case in reviews graph

Commit:b0eb2a2
Author:Jarrett Ye
Committer:GitHub

Feat/Estimated Total Knowledge By Note & Daily Load (#3507) * Feat/Estimated Total Knowledge By Note & Daily Load * Update rslib/src/stats/graphs/retrievability.rs * Update rslib/src/stats/graphs/future_due.rs

Commit:6ff309e
Author:Jarrett Ye
Committer:GitHub

Feat/option to enable FSRS short-term scheduler when (re)learning steps run out && speed up features based on simulation (#3505) * Update to FSRS-rs v1.3.2 * add fsrs_short_term_with_steps_enabled to config * ./ninja fix:minilints * fix defaults_for_testing * if current parameters are invalid, skip comparison fix #3498 * fix redundant_field_names * cargo clippy --fix * Update to FSRS-rs v1.3.3 * Update to FSRS-rs v1.3.4 * Avoid an extra config lookup on each card answer (dae)

Commit:b09326c
Author:Jarrett Ye
Committer:GitHub

Feat/export dataset for research (#3511) * Feat/export dataset for research * add comment Co-authored-by: Damien Elmes <dae@users.noreply.github.com> * target_path is required * format * improve efficiency to look up parent_id * move `use` down

Commit:f00211d
Author:Jarrett Ye
Committer:GitHub

add get_revlogs API && fix the style of tooltipText of ReviewsGraph (#3490) * add get_revlogs API * fix tooltipText of ReviewsGraph the style of true-retention shouldn't affect the style of tooltipText of ReviewsGraph * More verbose wording (dae)

Commit:a982720
Author:Jarrett Ye
Committer:GitHub

Feat/Easy Days (#3442) * Feat/Easy Days * format * add easy_days_percentages to deck_config * configure Easy Days via table * remove unused code * add translatable strings & add default of easy days * don't check easy_days_percentages when deserialize * pass test::all_reserved_fields_are_removed * consider next_day_at when interval_to_weekday * remove y-axis-title created in last simulation * EstimatedTotalKnowledge should be integer * Reorder deck option sections (dae) - Move FSRS to bottom left, to move it closer to the top, and so the left and right columns appear roughly balanced when FSRS is enabled. - Move Easy Days above Advanced * Don't crash if wrong number of days (dae) * Use lower field number (dae) Repeated fields are more compactly stored in the first 15 fields.

Commit:e2124cd
Author:a.r
Committer:GitHub

typeanswer: [type:nc] – ignores combining characters (#3422) * typeanswer: fix cleanup Fix: Add prepare_expected back in for the 'nothing typed' & 'correctly typed' cases. This also makes expected_original redundant again. Style: %s/provided/typed/g Style: rename one ch → c Testcase: whitespace_is_trimmed: added a check for the "correctly typed" path and renamed it to tags_removed (there's no whitespace?) Testcase: empty_input_shows_as_code: changed to also check that tags get trimmed * [type:nc] – ignores combining characters Adds a comparison variant to [type] which ignores when combining characters of the expected field are missing from the provided input. It still shows these characters in the 'expected' line for reference. It's useful for languages with e.g. diacritics that are required for reference (such as in dictionaries), but rarely actually learned or used in everyday writing. Among these languages: Arabic, Hebrew, Persian, Urdu. The bool 'combining' controls it as new final parameter of both relevant compare_answer functions. On the Python side, it's set to true by default. Use on the note templates: [type:nc:field] (only the front needs to include :nc) This also removes the need to have both variants of words/sentences present as separate fields, to show them redundantly, etc. * typeanswer: simplify by using nfkd throughout Requires adjusting two testcases, but both render exactly the same in Anki itself. On NFC vs. NKFD: https://stackoverflow.com/a/77432079 * typeanswer: 'simplify' by removing normalize_typed (requiring a bool parameter) I'd prefer to keep this extra method. * typeanswer: micro-optimize vectors Should get rid of most relocations, at the expense of over-allocating. On Vec's (String's) behavior: https://stackoverflow.com/a/72787776 * Mark `combining` as private typeCorrect is not marked as private either, but we can at least do the right thing for newly-added code. * Revert "typeanswer: micro-optimize vectors" This reverts commit 9fbacbfd196f159cbcf339aab6d8aa0830a455a5. * Revert "typeanswer: 'simplify' by removing normalize_typed (requiring a bool parameter)" This reverts commit df2dd3394eedab4b6a53acfac44db52d5728105f.

Commit:7959273
Author:Jarrett Ye
Committer:GitHub

Feat/forgetting curve in card info (#3437) * add elapsed time into revlog-table * add stability into revlog-table * add Graph of forgetting curve * fix eslint * add radio buttons of timeRange * add revlog filter && return [] for new card * format * translatable string & disable if using SM-2 * elapsedTime should skip manual or filtered review * add HoverColumns * fix eslint * add stability to tooltip & use timeSpan * reuse translatable strings * distinguish daysSinceFirstLearn and elapsedDaysSinceLastReview * Date x-axis & toLocaleString * Temporarily hide elapsed/stability columns (dae) https://github.com/ankitects/anki/pull/3437#issuecomment-2378851900

Commit:3912db3
Author:Jarrett Ye
Committer:GitHub

Feat/true retention stats (#3425) * Feat/true retention stats * ./ninja fix:minilints * use translatable strings & update style * remove card couts & add more translatable strings * Update statistics.ftl Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> * add Estimated total knowledge (cards) --------- Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com>

Commit:77fb0fb
Author:Ben Nguyen
Committer:GitHub

Possible to show “last” subdeck name in Browser? (#3387) * elide middle of deck names * Update CONTRIBUTORS * made elide mode enum * add elide mode field * fix enum number * remove dataclass decorator * Update CONTRIBUTORS * format rust code * Update CONTRIBUTORS * formatting * Update CONTRIBUTORS * fix type hint * Update CONTRIBUTORS

Commit:880c7d3
Author:Abdo
Committer:GitHub

Fix graph averages (#3406) * Fix graph averages * Fix formatting

Commit:ce2f413
Author:Arthur Milchior
Committer:GitHub

Empty cards become undoable (#3386) * Empty cards is undoable If there was a reason for this operation not to be undoable, I can't easily guess it. My main hyposhesis was that the number of deleted card may be too big. But I realized that deleting a deck is undoable and may delete as many note. As you may know, I realized that only the undoable operations triggered notification in AnkiDroid that we may have to update the UI. And while I just wanted to trigger more notifications, some reviewers thought it would be nicer if the operation were returning a OpChanges. So here it's done. If you would please consider merging it. I decided to introduce a new string because the closest strings I could find currently are "Empty cards..." and the trailing commas don't seem nice in "undo". And the title, which we may not be able to reuse in all language * Don't count cards that have already been removed (dae)

Commit:c6cb4e4
Author:Jake Probst
Committer:GitHub

load balancer! (#3230) * start of load balancer * add configuration options; option to load balance per deck * formatting * clippy * add myself to contributors * cleanup * cargo fmt * copyright header on load_balancer.rs * remove extra space * more formatting * python formatting * ignore this being None only doing this cause python has awful lambdas and can't loop in a meaningful way without doing this * only calculate notes on each day if we are trying to avoid siblings * don't fuzz intervals if the load balancer is enabled * force generator to eval so this actually happens * load balance instead of fuzzing, rather than in addition to * use builtin fuzz_bounds rather than reinvent something new * print some debug info on how its load balancing * clippy * more accurately load balance only when we want to fuzz * incorrectly doublechecking the presence of the load balancer * more printfs for debugging * avoid siblings -> disperse siblings * load balance learning graduating intervals * load balancer: respect min/max intervals; graduating easy should be at least +1 good * filter out after-days under minimum interval * this is an inclusive check * switch load balancer to caching instead of on the fly calculation * handle case where load balancer would balance outside of its bounds * disable lb when unselecting it in preferences * call load_balancer in StateContext::with_review_fuzz instead of next to * rebuild load balancer when card queue is rebuilt * remove now-unused configuration options * add note option to notetype to enable/disable sibling dispersion * add options to exclude decks from load balancing * theres a lint checking that the link actually exists so I guess I'll add the anchor back in later? * how did I even update this * move load balancer to cardqueue * remove per-deck balancing options * improve determining whether to disperse siblings when load balancing * don't recalculate notes on days every time * remove debug code * remove all configuration; load balancer enabled by default; disperse siblings if bury_reviews is set * didn't fully remove caring about decks from load balancer sql query * load balancer should only count cards in the same preset * fuzz interval if its outside of load balancer's range * also check minimum when bailing out of load balancer * cleanup; make tests happy * experimental weight-based load balance fuzzing * take into account interval when weighting as it seems to help * if theres no cards the interval weight is just 1.0 * make load balancer disableable through debug console * remove debug prints * typo * remove debugging print * explain a bit how load balancer works * properly balance per preset * use inclusive range rather than +1 * -1 type cast * move type hint somewhere less ugly; fix comment typo * Reuse existing deck list from parent function (dae) Minor optimisation

Commit:520564d
Author:Abdo
Committer:GitHub

Integrate AnkiHub Sign-in (#3232) * Add AnkiHub section to preferences screen * Add short intro for AnkiWeb and AnkiHub to syncing section * Add AnkiHub login screen * Implement login methods in backend * Set minimum dialog width * Add missing colon * Respect the ANKIHUB_APP_URL env var This is used by the add-on. * Simplify login error reporting * Fix from_prefs_screen not passed to subcall * Add missing ankihub_pb2 import * Install AnkiHub add-on after sign-in * Avoid .exec() * Update ftl/core/sync.ftl Co-authored-by: Damien Elmes <dae@users.noreply.github.com> * Split translation string * Support login by username/email * Fix entered username/email not being passed back to on_done * Remove unused import * Move to 'Third-party services' section * Tweak login dialog's heading * Remove 'third-party' from intro text * Tweak copy * Prefix profile keys * Tweak strings * Remove description from login dialog * Remove signup links * Clear credentials in ankihub_logout() * Call .adjustSize() * Title Case * Add padding to third-party services, and fix tab order from other PR