diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..8ad5e1b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,51 @@ +name: Release + +on: + push: + branches: + - main + - dev + +permissions: + contents: write + issues: write + pull-requests: write + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +jobs: + release: + name: Release + runs-on: ubuntu-latest + defaults: + run: + working-directory: frontend + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: yarn + cache-dependency-path: frontend/yarn.lock + + - name: Install dependencies + run: yarn install --frozen-lockfile + + # Gate the release: a push to main/dev with failing unit tests must not + # cut a version. (E2E is omitted here — it needs Playwright browsers and + # a live backend; PRs already run the full suite via test.yml.) + - name: Unit tests + run: yarn test + + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: yarn release diff --git a/.gitignore b/.gitignore index 1fd0c02..486af9a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ # Agent E2E run reports (the specs are tracked; the generated run logs are not) agent-tests/_runs/ +.playwright-mcp \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index b220d13..3e99a8d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -166,7 +166,9 @@ This repo uses **semantic versioning**, and commit titles follow **Conventional Don't dress a real feature as `refactor`/`chore` (it would skip a release) or inflate a refactor into `feat` (it over-bumps). If you squash-merge a PR, the **PR title** becomes the commit message, so it must follow the same convention. -> Release automation is **not** wired up in this repo yet (no `semantic-release`, no tags, `server/package.json` is `0.0.0`) — the convention currently records the *intended* bump. The sibling **subturtle-extension-apps** repo enforces the identical mapping automatically via `semantic-release`. +**Link the ClickUp task:** when the work has a task id, append it as `#` to the commit subject — and to the **PR title** so it survives a squash-merge — e.g. `feat: show dashboard version in a global footer #86exqazkq`. Use the bare id (not the `CU-` branch prefix). The type prefix still drives the version bump; the `#` just keeps `git log` greppable and linkable back to ClickUp. + +> Release automation is wired up for the **frontend** via `semantic-release` ([frontend/release.config.cjs](frontend/release.config.cjs), [.github/workflows/release.yml](.github/workflows/release.yml)) — it owns the version in [frontend/package.json](frontend/package.json) and cuts a tagged release on pushes to `dev`/`main` that contain releasable commits. The **server** has no release pipeline yet (`server/package.json` stays `0.0.0`). The sibling **subturtle-extension-apps** repo enforces the identical mapping via its own `semantic-release` setup. ## Gotchas diff --git a/frontend/CHANGELOG-DEV.md b/frontend/CHANGELOG-DEV.md new file mode 100644 index 0000000..5e54bc5 --- /dev/null +++ b/frontend/CHANGELOG-DEV.md @@ -0,0 +1,255 @@ +# [1.0.0-dev.5](https://github.com/codebridger/subturtle-dashboard-app/compare/v1.0.0-dev.4...v1.0.0-dev.5) (2026-07-10) + + +### Bug Fixes + +* guard pricing-page_viewed track so a token-less Mixpanel can't abort the subscription page mount [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh107 ([71cf5e0](https://github.com/codebridger/subturtle-dashboard-app/commit/71cf5e0fe5975fce202b583de6168a438ce08dd5)), closes [#86exkh107](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh107) + + +### Features + +* wire account_created, first-save & pricing-page analytics + enrich Stripe lifecycle events [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh107 ([5f49c7c](https://github.com/codebridger/subturtle-dashboard-app/commit/5f49c7ca5fdb6a47fd44d125bcd4085144896cc5)), closes [#86exkh107](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh107) + +# [1.0.0-dev.4](https://github.com/codebridger/subturtle-dashboard-app/compare/v1.0.0-dev.3...v1.0.0-dev.4) (2026-07-04) + + +### Bug Fixes + +* **leitner:** use real review RPCs and replace end-of-session alert with pilotui modal [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exnxphy ([9543401](https://github.com/codebridger/subturtle-dashboard-app/commit/954340138c5b92b61811187926d81f4045e108ef)), closes [#86exnxphy](https://github.com/codebridger/subturtle-dashboard-app/issues/86exnxphy) + +# [1.0.0-dev.3](https://github.com/codebridger/subturtle-dashboard-app/compare/v1.0.0-dev.2...v1.0.0-dev.3) (2026-07-03) + + +### Features + +* **pool:** Pool encode queue, Forgot×2 routing, age-out, and board/settings surfaces [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exnxp4t [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exnxpez ([f6ebc1d](https://github.com/codebridger/subturtle-dashboard-app/commit/f6ebc1d585cc317e24f2f4ce628a838c1847d46c)), closes [#86exnxp4t](https://github.com/codebridger/subturtle-dashboard-app/issues/86exnxp4t) [#86exnxpez](https://github.com/codebridger/subturtle-dashboard-app/issues/86exnxpez) + +# [1.0.0-dev.2](https://github.com/codebridger/subturtle-dashboard-app/compare/v1.0.0-dev.1...v1.0.0-dev.2) (2026-07-03) + + +### Features + +* **leitner:** return confirmed_chunk + source_sentence on review items for L3+ fill-in [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exnxph5 ([2856a3b](https://github.com/codebridger/subturtle-dashboard-app/commit/2856a3b90dd928a59d30928e24d1eb887530622e)), closes [#86exnxph5](https://github.com/codebridger/subturtle-dashboard-app/issues/86exnxph5) + +# 1.0.0-dev.1 (2026-06-19) + + +### Bug Fixes + +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y clear toasted activity card after session completion ([faf73fb](https://github.com/codebridger/subturtle-dashboard-app/commit/faf73fbe9cf05475c029516e862ea87161e8150e)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y fix toggle active color and persist bundle selection when box filtering ([14502c4](https://github.com/codebridger/subturtle-dashboard-app/commit/14502c4224cf794f09d8790cc958b2105d587611)) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y refactor to content/gap row pattern for correct centering ([707651e](https://github.com/codebridger/subturtle-dashboard-app/commit/707651ea993a5a2d1b90fe194f6a380f125c5ca9)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y resolved HourSelector overlap issue ([018bd5d](https://github.com/codebridger/subturtle-dashboard-app/commit/018bd5d26a640577e11bac8b78b994ad2f65e0fb)) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y verify and optimize Leitner auto-entry in phrase triggers ([9a4acf2](https://github.com/codebridger/subturtle-dashboard-app/commit/9a4acf2e008b8d2bba617312a4e6f7dd845a7791)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exgqfpu stabilize auth lifecycle and fix logout button ([7810302](https://github.com/codebridger/subturtle-dashboard-app/commit/78103029804980041fb4c0de032a03b9af1c6763)) +* add null check for transcript before updating conversation dialogs and live session record ([8c0e95c](https://github.com/codebridger/subturtle-dashboard-app/commit/8c0e95cad63017e09ed1a336c560a7728ba53ca6)) +* **analytics:** align Stripe lifecycle events with the metrics plan ([2f8f0e0](https://github.com/codebridger/subturtle-dashboard-app/commit/2f8f0e053cff093f92f8acc6a63c0a849c26dd28)) +* **analytics:** fire flashcard_review_started only when a review has cards ([914c210](https://github.com/codebridger/subturtle-dashboard-app/commit/914c21028c5638e69903f7a78998acb9dceca0ca)) +* cap freemium voice session at server-computed remaining minutes ([9337182](https://github.com/codebridger/subturtle-dashboard-app/commit/9337182286cb17ce410e7a73c67b4d52aebe8b04)) +* **checkout:** don't pass returnUrl to confirm() (session already sets return_url) ([9b52103](https://github.com/codebridger/subturtle-dashboard-app/commit/9b52103736949e20747a6235cb746097d90ff7d7)) +* **checkout:** mount Stripe Elements after render + scroll tall panel ([797777d](https://github.com/codebridger/subturtle-dashboard-app/commit/797777ddd4bfae86007dce307400acaa0d991622)) +* **ci:** set DASHBOARD_BASE_URL so getSubscriptionDetails resolves a paid tier; revert period diag ([0f0d48f](https://github.com/codebridger/subturtle-dashboard-app/commit/0f0d48ffb7379259b8047e8f388fd969f0d01423)) +* correct button click handler in DetailCard component and add max follow-up practice limit in live session instructions ([14d3a15](https://github.com/codebridger/subturtle-dashboard-app/commit/14d3a158078cfdbb090a611e3b568f7ca9a8cbdb)) +* correct redirect URI in auth router to remove hash mode for proper token exchange ([c8b368c](https://github.com/codebridger/subturtle-dashboard-app/commit/c8b368c2a495c80ee352155bf1cfccd6a8137523)) +* correct routing path for subscription navigation in ProfileButton component ([e6a9e7a](https://github.com/codebridger/subturtle-dashboard-app/commit/e6a9e7a968f47000f6c9f6df44fc0410d23b19fb)) +* correct unknown cost percentage and adjust token calculations in live session; ensure accurate cost representation by subtracting cached tokens from total tokens ([7407198](https://github.com/codebridger/subturtle-dashboard-app/commit/7407198865dcf77e47978d4a1285b0d57319c223)) +* **docker:** copy subscription module so frontend build resolves tier types ([943572c](https://github.com/codebridger/subturtle-dashboard-app/commit/943572caa8d204591269ea631fbe5ed086a3df87)) +* downgrade @codebridger/lib-vue-components to version 1.16.0 and update ProfileButton component to use computed profilePicture ([005a746](https://github.com/codebridger/subturtle-dashboard-app/commit/005a746cb59c9750be64d1cbbe665f132ee710f5)) +* **layout:** clip horizontal overflow from decorative page backgrounds ([8998654](https://github.com/codebridger/subturtle-dashboard-app/commit/899865437f8b503d920b3a8b02f7273abf0015c9)) +* **live-session:** drop empty parameters from no-arg finish_practice tool [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([aad0f83](https://github.com/codebridger/subturtle-dashboard-app/commit/aad0f8303dfa809a634b37ddbcc44fbbfc31338d)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h) +* **live-session:** freemium card no longer overlaps the voice-minutes line ([20dc3bf](https://github.com/codebridger/subturtle-dashboard-app/commit/20dc3bf8f4e5c50cac29e7c731d46750fb6a3039)) +* **live-session:** persist Gemini token usage for the final/AI-only turn ([01f6b47](https://github.com/codebridger/subturtle-dashboard-app/commit/01f6b47f312903e63c6aecb0499fdc02a38e4c34)) +* **live-session:** preserve Gemini thought_signature so text tool-calling works [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([82ebc77](https://github.com/codebridger/subturtle-dashboard-app/commit/82ebc776d1f43c291f8ced7d0d1ac8e5de373d4b)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h) +* **live-session:** restrict text-session model to the priced allow-list [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([5674854](https://github.com/codebridger/subturtle-dashboard-app/commit/5674854464b0df67c86801624231a91925a6972c)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h) +* **live-session:** scroll the session modal on small screens, pin the footer ([d1f757c](https://github.com/codebridger/subturtle-dashboard-app/commit/d1f757c868d2a5d6d7807e3de196e10af841b963)) +* **live-session:** UTF-8-safe base64 for the session request (non-ASCII bundle titles) ([72d708b](https://github.com/codebridger/subturtle-dashboard-app/commit/72d708b7e1dba7ad4e485af74f92aa1a009ae117)) +* merge voice minutes into freemium session card as inline pill ([1274a81](https://github.com/codebridger/subturtle-dashboard-app/commit/1274a8140f07f55b9b437e872e8ea37617e3ad4a)) +* **phrase,translation:** chunk subdoc schema, match-by-phrase, token headroom ([50af640](https://github.com/codebridger/subturtle-dashboard-app/commit/50af64013bade30c36597e1bb1c96a5e0e0f1713)) +* redirect to the subscription page after a successful payment, with refetch and animated waiting state ([3f6d88f](https://github.com/codebridger/subturtle-dashboard-app/commit/3f6d88f206ca77f3ba5ee6d36e0dc992997ac3a9)) +* refine auth middleware for improved login handling and update button links to remove hash mode for consistent routing ([dcdf282](https://github.com/codebridger/subturtle-dashboard-app/commit/dcdf28255111ccde8cae9bd265ff30bd336302bc)) +* refresh voice-minute balance when a live session ends ([8f44a04](https://github.com/codebridger/subturtle-dashboard-app/commit/8f44a0400fb202b458dd2a3d9a66fda513389339)) +* remove default color from Button in PracticeToolScaffold component ([4b80fdd](https://github.com/codebridger/subturtle-dashboard-app/commit/4b80fddf5b5880f113f7fd2e752eaa27889d26fe)) +* restrict phrase marking as practiced to user input instead of trigger actions [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([f8650de](https://github.com/codebridger/subturtle-dashboard-app/commit/f8650de19738925bf7258a0e283e962fe62e8f6d)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu) +* route Start New Session through the live-session dispatcher instead of a 404 route ([358cc1d](https://github.com/codebridger/subturtle-dashboard-app/commit/358cc1d4c6bd9b9edb466e1d923402457c3e4783)) +* **schedule:** [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet add timezone support testing and fix catch-up logic ([bb7d155](https://github.com/codebridger/subturtle-dashboard-app/commit/bb7d15526a4573f9000a5286a15f13ac060ddf2e)) +* **schedule:** make scheduled-job creation idempotent to prevent duplicate-key crash ([04b5159](https://github.com/codebridger/subturtle-dashboard-app/commit/04b5159846e805286dd8fb755dc56903961f3d41)) +* **subscription:** apply plan upgrades fully (tier, budgets, label) and block stacking ([a28b485](https://github.com/codebridger/subturtle-dashboard-app/commit/a28b485df7dead00dd1de09af852aae04554c5a0)) +* **subscription:** read current_period bounds item-first with subscription fallback; revert e2e collection rename ([e3424a2](https://github.com/codebridger/subturtle-dashboard-app/commit/e3424a24a5c30d41ed25f657f6e4c81381b76422)) +* **subscription:** rewrite Stripe product metadata authoritatively in setup-stripe-pricing ([260be05](https://github.com/codebridger/subturtle-dashboard-app/commit/260be05db07291dd53fad543ae133a9c5b4d95db)) +* **subscription:** show price skeleton while probing local currency to avoid GBP flash ([96b4ed1](https://github.com/codebridger/subturtle-dashboard-app/commit/96b4ed10b6703f051e7e2b315574f4aeeeb76a97)) +* **subscription:** show real text-chat usage on the active-plan card (was "Unlimited") ([93ef5ef](https://github.com/codebridger/subturtle-dashboard-app/commit/93ef5efbd410fde1a99e16570048eb5ab525ded9)) +* **subscription:** use Stripe's true fx rate for localized card prices ([30bca53](https://github.com/codebridger/subturtle-dashboard-app/commit/30bca535ec93fe86a88e84172eebf695f2b5e3de)) +* suppress the global tier-limit modal when a page renders the lock inline ([ca443e2](https://github.com/codebridger/subturtle-dashboard-app/commit/ca443e2aac740bf61c4118d1ae3fa579cd210806)) +* **translation:** only extract chunks from the marked text, not its context ([f408e83](https://github.com/codebridger/subturtle-dashboard-app/commit/f408e832825f1ac9115d6db47d66221d48765cbc)) +* **translation:** retry + validate structured LLM output to cut error rate ([dd5019b](https://github.com/codebridger/subturtle-dashboard-app/commit/dd5019b0dce4a6580a9c70ca745a8a0f7a9c0700)) +* **ui:** use IconPlayCircle — IconPlay is not a pilotui icon (rendered nothing) ([594c3f6](https://github.com/codebridger/subturtle-dashboard-app/commit/594c3f64f7d82b8180a90c3083214c046df18264)) +* update audio transcription model in live session to use gpt-4o-mini-transcribe ([be7494a](https://github.com/codebridger/subturtle-dashboard-app/commit/be7494af71a43be5f6c2c5e8c1128e6b1e2f8036)) +* update auth middleware to use fullPath for root redirect and adjust login route to hash mode ([3662084](https://github.com/codebridger/subturtle-dashboard-app/commit/36620844cf48becabd36fa45c37f03f9f2b9c39c)) +* update button links to use hash mode for consistent routing in live session and flashcard navigation ([5e243f9](https://github.com/codebridger/subturtle-dashboard-app/commit/5e243f9ca28fbcda5c8649ee9cb1ecfcbb94a01d)) +* update docker-compose.yml to change service port mapping from 8080 to 80 ([f52d9b6](https://github.com/codebridger/subturtle-dashboard-app/commit/f52d9b63a446f22cdfe5aa572123b4f59445de5c)) +* update login_with_token component to use loginWithToken method and add error logging on authentication failure ([7afcd91](https://github.com/codebridger/subturtle-dashboard-app/commit/7afcd91a16774dc64b87375a9e50d40bb2360caf)) +* update loginWithToken method to include second parameter for enhanced authentication flow ([0769ef5](https://github.com/codebridger/subturtle-dashboard-app/commit/0769ef5a2f3f7e7bba00601dd6c818c89e0f95b9)) +* update redirect URIs in auth router to use hash mode for improved routing ([9173430](https://github.com/codebridger/subturtle-dashboard-app/commit/917343083e7c77ea6532f45c89e8535483de92f2)) +* update return_url in getSubscription function to use DASHBOARD_BASE_URL instead of FRONTEND_URL; remove FRONTEND_URL from sample.env ([3a60399](https://github.com/codebridger/subturtle-dashboard-app/commit/3a60399479e87adcdf8fd71ed6e97a0a7c5e3321)) +* update router configuration to enable hash mode and adjust redirect logic in auth middleware ([b8451ba](https://github.com/codebridger/subturtle-dashboard-app/commit/b8451ba04a6dd0aaa0f3119d490802cbbaf19c5e)) +* update routing for subscription navigation in ProfileButton component ([e3ec16e](https://github.com/codebridger/subturtle-dashboard-app/commit/e3ec16e473e9cbd40c96e6a7bdbe5c8665ecce3d)) +* update vocabulary handling in live-session component to use selectedPhrases for accurate word indexing ([e7fc12a](https://github.com/codebridger/subturtle-dashboard-app/commit/e7fc12a24bdfa0e2a3f71f08262bebaa14cb1e48)) +* use singular "Sign in with Google" copy on login page [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh11q ([3c506ab](https://github.com/codebridger/subturtle-dashboard-app/commit/3c506ab7a0cc2a6171583ebba5bb86ab575a3e02)), closes [#86exkh11q](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh11q) + + +### Features + +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Add an empty trigger slot to the LeitnerPhrasePicker Modal. ([ab1940e](https://github.com/codebridger/subturtle-dashboard-app/commit/ab1940ebe644136826411ab5327d36e748fac738)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y add configurable review interval to Leitner settings. ([24b67fe](https://github.com/codebridger/subturtle-dashboard-app/commit/24b67fe4f67d69a9aa05066e6f3e93d24b2a2772)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Add Daily Limit configuration and enforcement ([a61c6e1](https://github.com/codebridger/subturtle-dashboard-app/commit/a61c6e15f5236460c65f91e068e39473f349efaa)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Bring back the Total box input on the Leitner box setting section ([e57672b](https://github.com/codebridger/subturtle-dashboard-app/commit/e57672b9f679f81a61e309fbec333778dcc4f58e)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y create reusable Toggle component and fix empty box filtering logic ([3ac08f4](https://github.com/codebridger/subturtle-dashboard-app/commit/3ac08f495391d2f2175d447f61976b14097dec07)) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Ensure the leitner-review-job always performs catch-up regardless of its explicit catchUp flag. ([17ed4cc](https://github.com/codebridger/subturtle-dashboard-app/commit/17ed4cc34aa5db4b0adbbb9a8baca8ac3a6df8ca)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y fix search input spacing and add box-only filter toggle ([e585404](https://github.com/codebridger/subturtle-dashboard-app/commit/e585404cc0742e9346615098787cbe041814defe)) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Implement a catch-up mechanism for recurrent scheduled jobs and pass execution times to job callbacks. ([27e2c24](https://github.com/codebridger/subturtle-dashboard-app/commit/27e2c24dd6596efcb418e5eae9c563a7a0d3f8d2)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Implement Leitner Box Spaced Repetition System ([b4a806a](https://github.com/codebridger/subturtle-dashboard-app/commit/b4a806af7f04b5f8497b2dba76a3ee7c96c54657)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y implement leitner box user preferences and settings ui ([2bbf1dc](https://github.com/codebridger/subturtle-dashboard-app/commit/2bbf1dc404cedea1e58ef8b2c6574302e1965861)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Implement Leitner System and Board Activity ([63ef0af](https://github.com/codebridger/subturtle-dashboard-app/commit/63ef0af67ebef3d536d44cf4dda43d3639133d7d)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Implement persistent board activities with `meta.isActive` for Leitner box reviews and add `BoardService` tests. ([e257177](https://github.com/codebridger/subturtle-dashboard-app/commit/e257177b6246751260d6d47c1c5d75a65cc79c8a)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y implement phrase-to-box tracking and refactor picker to dataProvider.list ([94da625](https://github.com/codebridger/subturtle-dashboard-app/commit/94da625eb50ccf183c07db8c52ae4c6478814853)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y implement refined Leitner notification system ([3152be9](https://github.com/codebridger/subturtle-dashboard-app/commit/3152be91ddbe875b799dd4b0c6244319fbe5f4f7)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y overhaul board page aesthetics and fix rendering issues ([b93f1cf](https://github.com/codebridger/subturtle-dashboard-app/commit/b93f1cf37dd8e1378f530e5d9139096a7d7e4fd4)) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y prevent phrase picker auto-close and defer state refresh until modal closure ([52f651d](https://github.com/codebridger/subturtle-dashboard-app/commit/52f651d1052798b6b7d6fa42d2ac7d82ee8b9691)) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y set up documentation download and conversion script in server/scripts ([8f8f7bf](https://github.com/codebridger/subturtle-dashboard-app/commit/8f8f7bf18ff0f81a902664cfdd02b1ef429c0034)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y sync phrase removal and refine user context in Leitner system ([dcb92c4](https://github.com/codebridger/subturtle-dashboard-app/commit/dcb92c44dbe0740ddacd4f1ba869702d61201c36)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y Update Leitner Box due date logic to include items due by the end of the current day, add corresponding tests, and remove the `initLeitner` function. ([390ab2d](https://github.com/codebridger/subturtle-dashboard-app/commit/390ab2d125ce055a1d9333723a89068adc8da0a8)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erqa08y use custom Toggle component for Auto-Entry in Preferences ([d3eeb1e](https://github.com/codebridger/subturtle-dashboard-app/commit/d3eeb1ea1a16162ee7cec2ad81f2564b7c718a1c)), closes [#86erqa08y](https://github.com/codebridger/subturtle-dashboard-app/issues/86erqa08y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erzxm7p - add new collections for subscription and daily credits in config ([3d763b0](https://github.com/codebridger/subturtle-dashboard-app/commit/3d763b0d5c44e45e66592a08c2289835e03b457e)), closes [#86erzxm7p](https://github.com/codebridger/subturtle-dashboard-app/issues/86erzxm7p) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erzxm7p add subscription details retrieval and integrate triggers in payment processing to add creadit into subscription system after succesfull payment. ([b891eca](https://github.com/codebridger/subturtle-dashboard-app/commit/b891eca054d3d78a64ecd1d9f71b06a2374693f6)), closes [#86erzxm7p](https://github.com/codebridger/subturtle-dashboard-app/issues/86erzxm7p) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erzxm7p enhance payment gateway with multi-provider support, including webhook handling and payment verification improvements ([915af8c](https://github.com/codebridger/subturtle-dashboard-app/commit/915af8c3304125c24cedb7129bfaacfc581584f2)), closes [#86erzxm7p](https://github.com/codebridger/subturtle-dashboard-app/issues/86erzxm7p) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)erzxm7p implement Stripe payment integration with checkout session handling, payment verification, and user subscription management ([90ff598](https://github.com/codebridger/subturtle-dashboard-app/commit/90ff59856459a0a0deac3657425af29dbc617aff)), closes [#86erzxm7p](https://github.com/codebridger/subturtle-dashboard-app/issues/86erzxm7p) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)et6azkg add text-to-speech functionality and voice listing in translation module ([4ecb1fa](https://github.com/codebridger/subturtle-dashboard-app/commit/4ecb1fa7c4353f79c736a7e472c4788deb95dcd0)), closes [#86et6azkg](https://github.com/codebridger/subturtle-dashboard-app/issues/86et6azkg) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdg7 implement freemium credit allocation system with default values and user management ([8e94091](https://github.com/codebridger/subturtle-dashboard-app/commit/8e94091787f29800398076ada1857a594cbac679)), closes [#86etkgdg7](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdg7) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdg7 update freemium credit allocation to 1M and adjust subscription handling in usage recording ([d10f676](https://github.com/codebridger/subturtle-dashboard-app/commit/d10f676d0dba2d76d2bd7fbdd1010e2f77e5d1c3)), closes [#86etkgdg7](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdg7) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu implement Gemini Live API for live sessions ([fbf147b](https://github.com/codebridger/subturtle-dashboard-app/commit/fbf147b96883aa42b3e5e2557514e0d051a4312b)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etp28k1 enhance freemium limitation modals across components for improved user experience and consistency ([d80207f](https://github.com/codebridger/subturtle-dashboard-app/commit/d80207f582b3279fb36fcc843a3a99217dc6fb17)), closes [#86etp28k1](https://github.com/codebridger/subturtle-dashboard-app/issues/86etp28k1) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etp28k1 implement freemium timer functionality in live session with modal alerts for session expiration ([3e87839](https://github.com/codebridger/subturtle-dashboard-app/commit/3e8783981341bf7c4a544f01052287b042ae8271)), closes [#86etp28k1](https://github.com/codebridger/subturtle-dashboard-app/issues/86etp28k1) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)eu01jz0 enhance PhraseCard component to handle 'linguistic' phrases by disabling submit button and preventing submission ([81796c6](https://github.com/codebridger/subturtle-dashboard-app/commit/81796c6c8cfcaacd14fac44ac4c6af25411094c4)), closes [#86eu01jz0](https://github.com/codebridger/subturtle-dashboard-app/issues/86eu01jz0) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)eu01jz0 enhance PhraseSchema and createPhrase function to support 'linguistic' type phrases, including additional fields for context and language information ([9a57ffe](https://github.com/codebridger/subturtle-dashboard-app/commit/9a57ffee336f6b0d0540279934532dd33014f37c)), closes [#86eu01jz0](https://github.com/codebridger/subturtle-dashboard-app/issues/86eu01jz0) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)eu01jz0 extend PhraseSchema to include detailed linguistic data structure, enhancing support for translation and contextual information ([93b9ae0](https://github.com/codebridger/subturtle-dashboard-app/commit/93b9ae0e94d7b525931541ec1c73293446102bf9)), closes [#86eu01jz0](https://github.com/codebridger/subturtle-dashboard-app/issues/86eu01jz0) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)eu01jz0 update PhraseCard component to dynamically handle translation and definition placeholders based on phrase type, and introduce computed property for translation value ([8769580](https://github.com/codebridger/subturtle-dashboard-app/commit/8769580d93a89e97b27e33ef5440fe611fdd89ad)), closes [#86eu01jz0](https://github.com/codebridger/subturtle-dashboard-app/issues/86eu01jz0) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewevg3v Internationalize Leitner components and integrate Leitner box statistics fetching and display. ([b3f9c4e](https://github.com/codebridger/subturtle-dashboard-app/commit/b3f9c4e48b69f7a1610881e89641747c9a8eb589)), closes [#86ewevg3v](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewevg3v) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewevg3v Update "Quota" label to "Cards Per Session" in English localization. ([531f124](https://github.com/codebridger/subturtle-dashboard-app/commit/531f1247c4f4841e6bff6d2a3ab93388751e3889)), closes [#86ewevg3v](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewevg3v) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewevg3y Implement common `PageHeader` and `Breadcrumb` components, updating bundle pages and documentation. ([93731d9](https://github.com/codebridger/subturtle-dashboard-app/commit/93731d9aeb9023245b8c5053cb22e7ad75d48b64)), closes [#86ewevg3y](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewevg3y) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewevg42 Implement custom Leitner review sessions for bundles with a dedicated frontend component and server-side logic. ([273304d](https://github.com/codebridger/subturtle-dashboard-app/commit/273304ddf5946d8db177a22ca3d08361bb6972b7)), closes [#86ewevg42](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewevg42) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Enhance Leitner settings with timezone clarification for review intervals and add related translations. ([c2348f2](https://github.com/codebridger/subturtle-dashboard-app/commit/c2348f2e200de41eeee00826bfc9d536fc15b9eb)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Implement a new TimezonePicker component and integrate it into the profile settings page, replacing the native select dropdown. ([b2dc50c](https://github.com/codebridger/subturtle-dashboard-app/commit/b2dc50c2705a5db234ee22456357bc829ff675cb)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Implement automatic Leitner box schedule resynchronization when a user's timezone is updated. ([f747592](https://github.com/codebridger/subturtle-dashboard-app/commit/f747592008985a60639b4ab996bf73a2ce071c9e)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Implement timezone support for Leitner box review scheduling and display. ([b3f240e](https://github.com/codebridger/subturtle-dashboard-app/commit/b3f240edeaefe3fd4639e96a497e34fe98a39db8)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet) +* [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)ewfyjet Implement user timezone setting ([2d3aef5](https://github.com/codebridger/subturtle-dashboard-app/commit/2d3aef5b94c60c3389a256ca5dd535365f5cd08c)), closes [#86ewfyjet](https://github.com/codebridger/subturtle-dashboard-app/issues/86ewfyjet) +* Add @nuxtjs/i18n module for internationalization support ([03d7548](https://github.com/codebridger/subturtle-dashboard-app/commit/03d754824f29f1c2f705f3063a1a33aea581bfc6)) +* add 3-tier pricing backend with 3-day credit-card trial [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkhcza ([5b37c61](https://github.com/codebridger/subturtle-dashboard-app/commit/5b37c61dc9e30298ba5204d6f90fcf7be210a4ba)), closes [#86exkhcza](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkhcza) +* add Billing and Settings pages with navigation and subscription details ([48c6bc6](https://github.com/codebridger/subturtle-dashboard-app/commit/48c6bc67aa76447b3578384a448a7bd88723ab96)) +* add ClickUp rules documentation and update package dependencies for improved functionality ([4759cb8](https://github.com/codebridger/subturtle-dashboard-app/commit/4759cb80e195b7ec896d61a8533f55c2c5b992f1)) +* add CORS configuration to server for specified origins and methods ([b1836f0](https://github.com/codebridger/subturtle-dashboard-app/commit/b1836f0f7cf2506ae8806bb239801af2d4956249)) +* add deployment workflows for EC2 and ECR, create Dockerfile for dashboard-v2, and update .gitignore and .dockerignore files ([856970e](https://github.com/codebridger/subturtle-dashboard-app/commit/856970e472d66e7e9d15a548436a53d6dd60801b)) +* add dialog filtering in live session query and enhance live session record handling ([382b40d](https://github.com/codebridger/subturtle-dashboard-app/commit/382b40d371263b00af77e7470ea061793cedf554)) +* Add e2e testing guide and apply authentication middleware to the board page. ([789f22a](https://github.com/codebridger/subturtle-dashboard-app/commit/789f22a7e714eaaa40a05094b2e468c8c4829bca)) +* add error messages and navigation button to live session page ([025183e](https://github.com/codebridger/subturtle-dashboard-app/commit/025183eeb01003f074cf3285d70d8ff2adb25ec3)) +* add expiration index for freemium credits based on duration configuration ([f3d99f9](https://github.com/codebridger/subturtle-dashboard-app/commit/f3d99f95ac958f647806f09a7adeafd8a36945ff)) +* add freemium user limitation for allowed lived sessions and update related functionality ([04b5fa4](https://github.com/codebridger/subturtle-dashboard-app/commit/04b5fa424aa03b19ae6dbaf1c818835ea9681312)) +* Add Google Meet to allowed CORS origins. ([247aa76](https://github.com/codebridger/subturtle-dashboard-app/commit/247aa769c0136460c8d5b1713cc25c8cdf6d865e)) +* add install-extension nudge banner on dashboard [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh0z3 ([a656a3d](https://github.com/codebridger/subturtle-dashboard-app/commit/a656a3de71405e91e0d475de881750323fda88da)), closes [#86exkh0z3](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh0z3) +* add mic level visualization and spacebar toggle, and include translation-masking mode in live sessions [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([042e67f](https://github.com/codebridger/subturtle-dashboard-app/commit/042e67fd375777b1c10e32bd4713ca309163b8a2)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu) +* add native language selection for AI sessions and implement text input for live practice [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([a0b77ab](https://github.com/codebridger/subturtle-dashboard-app/commit/a0b77ab3fd97db6fb1480abe4b7bc8c2002e74f8)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu) +* add new translation keys for Subscription and Billing sections, and update Sign Out labels ([0384fb8](https://github.com/codebridger/subturtle-dashboard-app/commit/0384fb808daa8eeb558f4785ce8e3dd57cf58307)) +* add opt-in text-based message composer with microphone toggle fallback [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([de37822](https://github.com/codebridger/subturtle-dashboard-app/commit/de378220de14f04da75b7d50a63c7ff35bef641f)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu) +* add profile reset functionality to subscription settings for testing purposes, including UI updates and backend integration ([dde8bde](https://github.com/codebridger/subturtle-dashboard-app/commit/dde8bdef6746016b4a6ba3dbda29b486a128fbe2)) +* add README.md for SubTurtle Dashboard App and update live-session component to handle audio transcript deltas; refactor server to use environment variable for MongoDB prefix ([fa73f32](https://github.com/codebridger/subturtle-dashboard-app/commit/fa73f329456719f2178112f1b904597884477a77)) +* add session expiry message and update UI to display session expiration details ([8302996](https://github.com/codebridger/subturtle-dashboard-app/commit/8302996a641b4a474a907f9598819a72cd854cf9)) +* add Sidebar component for profile navigation with tabs for Profile, Subscription, and Billing ([fb69dd5](https://github.com/codebridger/subturtle-dashboard-app/commit/fb69dd54e002d7af4c49b34dad9db686b4cff48f)) +* add subscription settings page and profile management, update translations for subscription features ([d1e00ac](https://github.com/codebridger/subturtle-dashboard-app/commit/d1e00ac55d6e4af38d7b7c03ae958cfd1ceacac1)) +* Add Teams.microsoft.com to allowed CORS origins. ([1b3d84c](https://github.com/codebridger/subturtle-dashboard-app/commit/1b3d84c837e8bb61c8d6d0c92a7bae56b1ca9d48)) +* add ThemeSwitcher component and update layout to include theme selection; redirect root route to /statistic ([9d67f85](https://github.com/codebridger/subturtle-dashboard-app/commit/9d67f855e878ccb585217279ed27229460874a37)) +* allow all origins in CORS configuration for dashboard server ([ef8ced8](https://github.com/codebridger/subturtle-dashboard-app/commit/ef8ced87be3bad7992222b7266da3be610d03318)) +* allow wildcard origin in CORS configuration ([73282d4](https://github.com/codebridger/subturtle-dashboard-app/commit/73282d4f8092d9845c1cd821b30211ae75d0eb23)) +* **analytics:** convention-named lifecycle events + missing engagement events ([001209f](https://github.com/codebridger/subturtle-dashboard-app/commit/001209fb7ce9f240cf7d0f0827c76c888ab8bd8a)) +* **checkout:** embedded Custom Checkout with Adaptive Pricing localized prices ([3210cdd](https://github.com/codebridger/subturtle-dashboard-app/commit/3210cdd93a9ec3131244c93cf2eda0115e9be7d2)) +* decrement freemium allocation on phrase deletion in bundle store for improved resource management ([b4b48c3](https://github.com/codebridger/subturtle-dashboard-app/commit/b4b48c35be5811d788fb00d04632706b7cc26531)) +* disable submit button when phrase or translation is empty in PhraseCard component ([5495555](https://github.com/codebridger/subturtle-dashboard-app/commit/54955557011b5ab4292ea9eb803e5996c4253eae)) +* Enhance `development/SKILL.md` with E2E testing and navigation guidelines, and new principles for testing, documentation, and UI component usage. ([16d4f81](https://github.com/codebridger/subturtle-dashboard-app/commit/16d4f816152322923bec3e8343b631d88fa15239)) +* enhance CORS configuration to dynamically handle origins and log unauthorized requests ([fce9b74](https://github.com/codebridger/subturtle-dashboard-app/commit/fce9b7452abd0237f1dabae487bfa046536f3c05)) +* enhance GenerativeCard and WordGenerativeCover components with click handling and navigation ([7e8b5ef](https://github.com/codebridger/subturtle-dashboard-app/commit/7e8b5ef39e251484db440c29a476f85865356700)) +* enhance live session features by adding metadata support and updating UI components for session details and history ([f980555](https://github.com/codebridger/subturtle-dashboard-app/commit/f9805557072b097f7b1d407670541458025ffa65)) +* enhance live session functionality with dynamic word handling and improved instructions ([d64023b](https://github.com/codebridger/subturtle-dashboard-app/commit/d64023b2ecea00540787dcdbb2f6669d38b1545e)) +* enhance live session page with empty state handling and new session prompts ([b3274f7](https://github.com/codebridger/subturtle-dashboard-app/commit/b3274f793a26e5e91968b5b733ef5e80f01fc5ae)) +* enhance phrase management with improved delete functionality and freemium allocation tracking ([2419740](https://github.com/codebridger/subturtle-dashboard-app/commit/2419740de425e123f8f5cbe2f36df0a01dec86ad)) +* enhance PracticeToolScaffold with dynamic body class and integrate into live session page ([729cc0d](https://github.com/codebridger/subturtle-dashboard-app/commit/729cc0d119da468744698a6e565e23db11062cba)) +* enhance subscription handling with freemium allocation and type updates ([6683bb1](https://github.com/codebridger/subturtle-dashboard-app/commit/6683bb1bca82314bd1bb902a9691013e7e1f8796)) +* fetch subscription to update freemium allocation after starting live session ([88b4535](https://github.com/codebridger/subturtle-dashboard-app/commit/88b4535fd3d947d0d5a58a86b6a979bf401c91dd)) +* **flashcard:** modularize card modes + unified flip toggle ([4249a0c](https://github.com/codebridger/subturtle-dashboard-app/commit/4249a0cd81df37c63bf4a16f5e352e0c1ba8af4c)) +* **flashcard:** new translation shape + L3+ fill-in cloze ([62613d4](https://github.com/codebridger/subturtle-dashboard-app/commit/62613d4c7b57c7d32a6e5ad542aa676b05ed81e4)) +* **gateway:** single-currency GBP checkout with Stripe Adaptive Pricing (S7) ([9bb38f5](https://github.com/codebridger/subturtle-dashboard-app/commit/9bb38f50cca530d4a3f084d5c9440c8fd95c475d)) +* implement cancelSubscriptionByProviderAndSubscriptionId function in subscription service; enhance StripeAdapter to handle subscription deletion events and update subscription status management ([2ed6f15](https://github.com/codebridger/subturtle-dashboard-app/commit/2ed6f15799171c7aae7fa06f00a51a997ebf2913)) +* implement create and update phrase functionality with freemium allocation management in bundle store and backend ([0c24754](https://github.com/codebridger/subturtle-dashboard-app/commit/0c24754806c4d11ba110d41d90ffd297a411b582)) +* implement empty state for bundles page with user prompts and loading state management ([de51624](https://github.com/codebridger/subturtle-dashboard-app/commit/de51624fac483d0b5ae170df734ae143fc8478fe)) +* implement freemium alerts with add phrase functionality in a new component ([50c78c9](https://github.com/codebridger/subturtle-dashboard-app/commit/50c78c96691ce93238cf414168bf7f02264b3df0)) +* implement freemium allocation updates on phrase bundle creation and deletion ([f4a38d2](https://github.com/codebridger/subturtle-dashboard-app/commit/f4a38d2efb9a338372b1a3a7c3c52371a99959f9)) +* implement getSubscription function to streamline subscription retrieval; refactor getSubscriptionDetails to utilize new function and enhance response normalization for Stripe payments ([096d06a](https://github.com/codebridger/subturtle-dashboard-app/commit/096d06a485bb6a1eafa55becb358f71b6ccf4cdc)) +* implement live session store with conversation dialog handling ([805c7a2](https://github.com/codebridger/subturtle-dashboard-app/commit/805c7a2b63a859dabac9923336cbedda50baac8f)) +* implement removePhrase function with freemium allocation update ([efc06dc](https://github.com/codebridger/subturtle-dashboard-app/commit/efc06dc7933ea2c31114c7801f54e1a96a0e6435)) +* implement subscription page with monthly plan details and checkout functionality ([b8bedf6](https://github.com/codebridger/subturtle-dashboard-app/commit/b8bedf6507692c5d17be480baa5469c7a30688f5)) +* implement subscription renewal [cacelletion and extnesion] for stripe integration ([9ce3808](https://github.com/codebridger/subturtle-dashboard-app/commit/9ce3808a14fa850918a707c305153f14b96b8975)) +* improve phrase display and refactor active phrase handling in live session ([ffa987e](https://github.com/codebridger/subturtle-dashboard-app/commit/ffa987e6e7c9b8092a73f8c56de692ac530e6c1c)) +* integrate StartLiveSessionForm component into bundle page and update modal trigger for improved user experience ([454382c](https://github.com/codebridger/subturtle-dashboard-app/commit/454382c24ead67c9cbccbcc33d29aabe56679708)) +* **live-session:** add text-only conversation mode [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([d9abac4](https://github.com/codebridger/subturtle-dashboard-app/commit/d9abac4a7e008d7889706918756bc39e532aa563)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h) +* **live-session:** mode-aware limits in the Start-Live-Session modal ([f51aa46](https://github.com/codebridger/subturtle-dashboard-app/commit/f51aa46a0fad9a5060f91e026e612b58f3d008e7)) +* **live-session:** mode-aware limits on the /sessions/new start screen ([4ea1c8a](https://github.com/codebridger/subturtle-dashboard-app/commit/4ea1c8afcbd0e02475e1bf86ccdf8aeb7ad134b3)) +* **live-session:** single /practice/live-session gate + server voice list ([9bb25ec](https://github.com/codebridger/subturtle-dashboard-app/commit/9bb25ecf93f866d32f936399b1a5a03f378cb9be)) +* **live-session:** single /practice/live-session gate + server voice list ([9dcea17](https://github.com/codebridger/subturtle-dashboard-app/commit/9dcea1798c01372f1f54d82ddd22d72f6c3835a5)) +* persist Google profile picture as base64 in localStorage with broken-URL fallback [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkh0z3 ([8011909](https://github.com/codebridger/subturtle-dashboard-app/commit/8011909a49412e3bba3db17d4cff0034ea9f5adc)), closes [#86exkh0z3](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkh0z3) +* rebuild subscription page for 3-tier pricing and cap-moment upgrades [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exkhcza ([0430e26](https://github.com/codebridger/subturtle-dashboard-app/commit/0430e26a86165a86c54b902219c1e610df55a309)), closes [#86exkhcza](https://github.com/codebridger/subturtle-dashboard-app/issues/86exkhcza) +* refactor audio transcription handling in live session to improve event processing ([57c243e](https://github.com/codebridger/subturtle-dashboard-app/commit/57c243e05d77534a9e8bb5ff941d37f249f58d8f)) +* refactor phrase schema and enhance createPhrase function to include translation_language and prevent duplicate phrases in bundles ([4c4cb3d](https://github.com/codebridger/subturtle-dashboard-app/commit/4c4cb3daddb2fb704941bb6bef62bcd3896b6ddd)) +* Reorganize agent documentation by introducing a development skill, integrating lib-vue-components docs, and updating doc download paths with conditional markdown conversion. ([dcca8b2](https://github.com/codebridger/subturtle-dashboard-app/commit/dcca8b2c41fc47e735c18dda3ffc4f0a84f23606)) +* reset session state on creation and improve native language detection for live sessions [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([9b8a85f](https://github.com/codebridger/subturtle-dashboard-app/commit/9b8a85fc620cb1bcaab0fbbb7587cff8100bb2a4)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu) +* **schedule:** implement schedule service and tests CU-86erqa08y ([8a99fb8](https://github.com/codebridger/subturtle-dashboard-app/commit/8a99fb87678dc6bfc872b66ec37d336d62660be8)) +* **sessions:** show live-session duration on history and detail pages ([f461783](https://github.com/codebridger/subturtle-dashboard-app/commit/f461783fc0e6c9110d9a33cfa5d2b51094c6242d)) +* show dashboard version in a global footer [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exqazkq ([8e58fb5](https://github.com/codebridger/subturtle-dashboard-app/commit/8e58fb5febba3aec837c6ac35b1c5aa2c9969db2)), closes [#86exqazkq](https://github.com/codebridger/subturtle-dashboard-app/issues/86exqazkq) [#footer](https://github.com/codebridger/subturtle-dashboard-app/issues/footer) +* simplify get_next_word handler and enhance session creation response ([ada1855](https://github.com/codebridger/subturtle-dashboard-app/commit/ada1855f419f5687849fd43d06048918b1e0eba6)) +* **subscription:** add Stripe metadata entitlement parser and resolver (S1) ([873a1a0](https://github.com/codebridger/subturtle-dashboard-app/commit/873a1a0c4082baaf01d3d50f35bafa4bcebb3a9f)) +* **subscription:** add voice-minute fields to subscription + free_credit, seed on grant (S4) ([ed1de09](https://github.com/codebridger/subturtle-dashboard-app/commit/ed1de09f61336992b9df11e0e5d9099907ac7c23)) +* **subscription:** build getSubscriptionPlans from live Stripe with last-known-good cache (S3) ([97b92dc](https://github.com/codebridger/subturtle-dashboard-app/commit/97b92dc688539a37085997bc9d42764c4410d64a)), closes [hi#traffic](https://github.com/hi/issues/traffic) +* **subscription:** cap Reader text chat — 60 chats/mo + 60 msgs/chat (S16) ([0de9fa6](https://github.com/codebridger/subturtle-dashboard-app/commit/0de9fa64dbc398eef7a8cf0537fc57cc4bd42ab0)) +* **subscription:** enforce save_words, weekly_insights & live-session caps from entitlements ([1d76506](https://github.com/codebridger/subturtle-dashboard-app/commit/1d765068085ea78c57636781d8e078bddafd00eb)) +* **subscription:** gate full session history behind session_history (Learner+) via list-live-sessions RPC ([de43b4c](https://github.com/codebridger/subturtle-dashboard-app/commit/de43b4cd674d571182aea4595372f81cbe77b981)) +* **subscription:** gate the sessions page via list-live-sessions RPC and debit voice minutes on session end ([f7ab65b](https://github.com/codebridger/subturtle-dashboard-app/commit/f7ab65b335e9d9abf01060210cec845cc3b344a7)) +* **subscription:** global upgrade modal when a tier limit blocks an RPC ([1e67ae9](https://github.com/codebridger/subturtle-dashboard-app/commit/1e67ae9cf7a6faa96c46319aefbabc67b8206de2)) +* **subscription:** grant entitlements from Stripe metadata with idempotency (S2) ([fb760b7](https://github.com/codebridger/subturtle-dashboard-app/commit/fb760b7384fa89623f8c2d0139ab1173c5f24cfc)) +* **subscription:** localize pricing-card prices via Adaptive Pricing (EUR for EU) ([a8c453f](https://github.com/codebridger/subturtle-dashboard-app/commit/a8c453f981d240a9ce6733ae52df35c70ed7fec1)) +* **subscription:** make paid-tier copy, badge, highlight & trial Stripe-driven (single source of truth) ([6ea0bc9](https://github.com/codebridger/subturtle-dashboard-app/commit/6ea0bc998169e513a8cd12eb202fdd08318fab9e)) +* **subscription:** meter voice minutes per tier (gate + debit) and fix paid-tier entitlement lookup ([b0b55c6](https://github.com/codebridger/subturtle-dashboard-app/commit/b0b55c6dedeb02ce5838b2e5561eb6d564c192ba)) +* **subscription:** Reader text-chat counter + Reader-specific limit copy (S17) ([06460d0](https://github.com/codebridger/subturtle-dashboard-app/commit/06460d064c0993f3f94ab3baada60a25d51181d3)) +* **subscription:** render pricing page from backend plans, drop currency picker (S9) ([0b27c00](https://github.com/codebridger/subturtle-dashboard-app/commit/0b27c00c2c0ae5b1e9b3ef47c8bd0f44b92e0e96)) +* **subscription:** script-provision the Stripe portal config, with setup guards and a startup check ([7762f00](https://github.com/codebridger/subturtle-dashboard-app/commit/7762f00ef9e7f2ae9a053ac8132ff927e1d01b38)) +* **subscription:** shared FeatureLocked panel — gate /statistic, refactor /sessions (S15) ([4f0563c](https://github.com/codebridger/subturtle-dashboard-app/commit/4f0563c696e20c521a8eebef5c43142c4f7d1f7a)) +* **subscription:** show all plan entitlements on the active-plan "This month" card ([6248228](https://github.com/codebridger/subturtle-dashboard-app/commit/62482284c742343d2671b7925a3ec2c1e64548cc)) +* **subscription:** show Starter as a plan card with current-plan and downgrade-to-free states ([31355ef](https://github.com/codebridger/subturtle-dashboard-app/commit/31355eff2432689652cd38fca6401b8e9514567c)) +* **subscription:** Starter free-tier usage card on the subscription page ([455fe63](https://github.com/codebridger/subturtle-dashboard-app/commit/455fe63478f3ad61f771fa8c581a737ade11415b)) +* **subscription:** voice balance meter + "This month" section (S12) ([2ab6a20](https://github.com/codebridger/subturtle-dashboard-app/commit/2ab6a209ab021ef779476c10df8202b399e4bdee)) +* **subscription:** voice top-up packs — grant webhook + active_top_ups payload (S11) ([aeaf21c](https://github.com/codebridger/subturtle-dashboard-app/commit/aeaf21c0ee90017ee23c45e59b477f6deb72640e)) +* **subscription:** voice top-up purchase flow + /settings/billing (S14) ([2d8ff15](https://github.com/codebridger/subturtle-dashboard-app/commit/2d8ff156cc24fc5516a849ac589652732d0b1ed7)) +* **subscription:** voice-cap 80% banner + 100% Start-Voice-Chat modal (S13) ([60cd505](https://github.com/codebridger/subturtle-dashboard-app/commit/60cd505c57a9a826438d86da5b6934e4fb1da66a)) +* **translation,phrase:** chunk-aware save schema, AI advisor, bundle suggestion ([82abb5e](https://github.com/codebridger/subturtle-dashboard-app/commit/82abb5edfe456028d4d9c540bcc9f1cb3e96645a)) +* **translation:** per-chunk definition for chunk-aware save ([363fe39](https://github.com/codebridger/subturtle-dashboard-app/commit/363fe395daecf55f4fac5fc3266b47134a79e46d)) +* update @modular-rest/server dependency to version 1.15.0 ([325a9d8](https://github.com/codebridger/subturtle-dashboard-app/commit/325a9d845c26c9cd83169866278de29a47347e12)) +* update createPhrase functionality to support multiple bundle IDs for improved phrase management and access verification ([ef151f5](https://github.com/codebridger/subturtle-dashboard-app/commit/ef151f5df68b4f92e0ab76bacca88b237bbdc8b7)) +* update dashboard navigator to reduce the nesting complexity, the nvigator dosent has nested items now. ([94be814](https://github.com/codebridger/subturtle-dashboard-app/commit/94be8147685c00d8cb61cf1fbaa468f314ad33d5)) +* update Dockerfile to include .npmrc and modify GitHub Actions workflow to create .npmrc file during deployment ([8394f42](https://github.com/codebridger/subturtle-dashboard-app/commit/8394f42b32411c6ecd2c3ff1674d59ff24c3fb2c)) +* update Gemini token tracking to include tool use, thoughts, and dedicated video token metrics [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)etkgdqu ([8cebf65](https://github.com/codebridger/subturtle-dashboard-app/commit/8cebf65672a1d4088d2284f42ea71349bbd946f6)), closes [#86etkgdqu](https://github.com/codebridger/subturtle-dashboard-app/issues/86etkgdqu) +* update live session page to ensure bundleId is a string and maintain consistent structure ([ea8cb07](https://github.com/codebridger/subturtle-dashboard-app/commit/ea8cb07673eb9bfff2a510993bb33b9541457f8a)) +* update live session page with improved layout and dynamic phrase display ([a65814a](https://github.com/codebridger/subturtle-dashboard-app/commit/a65814a124346f258231f6b3f1876ffab8e594c5)) +* update membership plans page with new subscription terminology and enhanced UI components ([f101e12](https://github.com/codebridger/subturtle-dashboard-app/commit/f101e1251da72386196fdc655584e8ab5854d54b)) +* update Pro plan feature label to reflect 60 monthly chat limit ([1f17577](https://github.com/codebridger/subturtle-dashboard-app/commit/1f175774f832deed9d2d17bab7cfe26b12ec7f08)) +* update subscription button logic in settings page; differentiate between freemium and paid plans for better user experience ([26631c0](https://github.com/codebridger/subturtle-dashboard-app/commit/26631c0a0de6fb087f50db1eed52d75cad2169a7)) +* update subscription status handling to include additional states and modify active subscription query logic ([3d74382](https://github.com/codebridger/subturtle-dashboard-app/commit/3d743822bdd8cd8041164487d8e148e3a1c1a88e)) + + +### Performance Improvements + +* **live-session:** cache static text-turn prefix to cut token cost [#86](https://github.com/codebridger/subturtle-dashboard-app/issues/86)exr424h ([636a25a](https://github.com/codebridger/subturtle-dashboard-app/commit/636a25a1fe2ce1e63412b7d19d824aa665c320dd)), closes [#86exr424h](https://github.com/codebridger/subturtle-dashboard-app/issues/86exr424h) diff --git a/frontend/components/FeatureLocked.vue b/frontend/components/FeatureLocked.vue index bd7540c..989ea88 100644 --- a/frontend/components/FeatureLocked.vue +++ b/frontend/components/FeatureLocked.vue @@ -63,9 +63,9 @@ // Primary CTA pre-selects the required tier on the pricing page; secondary lists all. function goUpgrade() { - router.push(`/settings/subscription?suggest=${props.requiredTier}`); + router.push(`/settings/subscription?suggest=${props.requiredTier}&from=cap-hit-banner`); } function goToPlans() { - router.push('/settings/subscription'); + router.push('/settings/subscription?from=cap-hit-banner'); } diff --git a/frontend/components/Pool/PoolSettings.vue b/frontend/components/Pool/PoolSettings.vue new file mode 100644 index 0000000..7bcc3ef --- /dev/null +++ b/frontend/components/Pool/PoolSettings.vue @@ -0,0 +1,143 @@ + + + diff --git a/frontend/components/PoolCard.vue b/frontend/components/PoolCard.vue new file mode 100644 index 0000000..94f6b32 --- /dev/null +++ b/frontend/components/PoolCard.vue @@ -0,0 +1,99 @@ + + + diff --git a/frontend/components/PoolReviewItem.vue b/frontend/components/PoolReviewItem.vue new file mode 100644 index 0000000..6401eb7 --- /dev/null +++ b/frontend/components/PoolReviewItem.vue @@ -0,0 +1,23 @@ + + + diff --git a/frontend/components/TextChatCounter.vue b/frontend/components/TextChatCounter.vue index 81f929f..8cc1274 100644 --- a/frontend/components/TextChatCounter.vue +++ b/frontend/components/TextChatCounter.vue @@ -41,6 +41,6 @@ // At the cap, point the user at Learner's unlimited text chat. function findOutMore() { - router.push('/settings/subscription?suggest=learner'); + router.push('/settings/subscription?suggest=learner&from=cap-hit-banner'); } diff --git a/frontend/components/VoiceCapBanner.vue b/frontend/components/VoiceCapBanner.vue index dfffbd9..e865c21 100644 --- a/frontend/components/VoiceCapBanner.vue +++ b/frontend/components/VoiceCapBanner.vue @@ -55,6 +55,6 @@ // Learner's "Upgrade plan" highlights Coach; Coach has no tier above (button hidden). function goUpgrade() { - router.push('/settings/subscription?from=voice-banner&suggest=coach'); + router.push('/settings/subscription?from=cap-hit-banner&suggest=coach'); } diff --git a/frontend/components/freemium_alerts/LimitationModal.vue b/frontend/components/freemium_alerts/LimitationModal.vue index 52eb584..b40586d 100644 --- a/frontend/components/freemium_alerts/LimitationModal.vue +++ b/frontend/components/freemium_alerts/LimitationModal.vue @@ -119,7 +119,7 @@ function handlePrimaryAction(toggleModal?: (value: boolean) => void) { // Default behavior: redirect to subscription page (can be overridden by parent) if (props.autoRedirectOnUpgrade) { - router.push('/settings/subscription'); + router.push('/settings/subscription?from=cap-hit-banner'); analytic.track('upgrade-cta_clicked'); } } diff --git a/frontend/components/freemium_alerts/UsageCapBanner.vue b/frontend/components/freemium_alerts/UsageCapBanner.vue index d8f3868..63d0a49 100644 --- a/frontend/components/freemium_alerts/UsageCapBanner.vue +++ b/frontend/components/freemium_alerts/UsageCapBanner.vue @@ -37,6 +37,6 @@ const state = computed<'hidden' | 'warning' | 'paused'>(() => { }); function goToPlans() { - router.push('/settings/subscription'); + router.push('/settings/subscription?from=cap-hit-banner'); } diff --git a/frontend/components/partial/AppVersionFooter.vue b/frontend/components/partial/AppVersionFooter.vue new file mode 100644 index 0000000..87600aa --- /dev/null +++ b/frontend/components/partial/AppVersionFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend/components/partial/ProfileButton.vue b/frontend/components/partial/ProfileButton.vue index 1c9aa36..c3b3ce6 100644 --- a/frontend/components/partial/ProfileButton.vue +++ b/frontend/components/partial/ProfileButton.vue @@ -37,7 +37,7 @@ goToLeitnerSettings(); "> - {{ t('smart_review.settings') }} + {{ t('preferences.nav') }}
  • diff --git a/frontend/components/practice/PoolReviewSession.vue b/frontend/components/practice/PoolReviewSession.vue new file mode 100644 index 0000000..eca0905 --- /dev/null +++ b/frontend/components/practice/PoolReviewSession.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/frontend/composables/useDashboardNavigatorItems.ts b/frontend/composables/useDashboardNavigatorItems.ts index 7f2ee62..d5e76a5 100644 --- a/frontend/composables/useDashboardNavigatorItems.ts +++ b/frontend/composables/useDashboardNavigatorItems.ts @@ -17,11 +17,6 @@ export const useDashboardNavigatorItems = (): Array => { { title: t('practice.title'), children: [ - { - title: t('smart_review.settings'), - icon: 'IconSettings', - to: '/settings/preferences', - }, { title: t('activities.title'), icon: 'iconify solar--rocket-2-bold-duotone', @@ -32,6 +27,11 @@ export const useDashboardNavigatorItems = (): Array => { icon: 'IconMenuDatatables', to: '/bundles', }, + { + title: t('preferences.nav'), + icon: 'IconSettings', + to: '/settings/preferences', + }, ], }, { diff --git a/frontend/constants/analyticsEvents.ts b/frontend/constants/analyticsEvents.ts index 790f931..02a1445 100644 --- a/frontend/constants/analyticsEvents.ts +++ b/frontend/constants/analyticsEvents.ts @@ -5,8 +5,11 @@ export const ANALYTICS_EVENTS = { CAP_HIT: 'cap_hit', // props: { cap: 'save_words' | 'ai_taste' } CHECKOUT_OPENED: 'checkout_opened', // props: { tier, cadence, currency } — checkout panel opened + PRICING_PAGE_VIEWED: 'pricing-page_viewed', // props: { from_surface } — subscription page opened FLASHCARD_REVIEW_STARTED: 'flashcard_review_started', // props: { deck_type } USER_LOGGED_IN: 'user_logged-in', // explicit login only, not session restore + ACCOUNT_CREATED: 'account_created', // server-fired (auth: first OAuth exchange for a new account) + PHRASE_SAVED_FIRST_TIME: 'phrase_saved_first-time', // server-fired (first-ever phrase save) TRIAL_STARTED: 'trial_started', // server-fired (Stripe webhook: subscription created as trialing) SUBSCRIPTION_STARTED: 'subscription_started', // server-fired (trial converted, or direct paid start) SUBSCRIPTION_CANCELED: 'subscription_canceled', // server-fired, props: { was_trialing } diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue index 38b5c98..0c40fd9 100644 --- a/frontend/layouts/default.vue +++ b/frontend/layouts/default.vue @@ -29,6 +29,10 @@ + + +
    + +
    +
    @@ -52,7 +58,7 @@
    -
    +
    @@ -185,6 +191,7 @@ diff --git a/frontend/pages/practice/pool.vue b/frontend/pages/practice/pool.vue new file mode 100644 index 0000000..63eb1e6 --- /dev/null +++ b/frontend/pages/practice/pool.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/frontend/pages/settings/preferences.vue b/frontend/pages/settings/preferences.vue index 3e9afd4..5a4cc8b 100644 --- a/frontend/pages/settings/preferences.vue +++ b/frontend/pages/settings/preferences.vue @@ -1,25 +1,43 @@