Skip to content

feat(learn): make tutor session names editable#93

Merged
Jose-Gael-Cruz-Lopez merged 6 commits into
mainfrom
feat/editable-session-names
May 6, 2026
Merged

feat(learn): make tutor session names editable#93
Jose-Gael-Cruz-Lopez merged 6 commits into
mainfrom
feat/editable-session-names

Conversation

@Jose-Gael-Cruz-Lopez
Copy link
Copy Markdown
Member

@Jose-Gael-Cruz-Lopez Jose-Gael-Cruz-Lopez commented May 5, 2026

Closes #91

Summary

  • New `PATCH /api/learn/sessions/{id}` endpoint that renames a session's `topic` (validates 1–120 chars, enforces ownership, supports in-memory pending sessions)
  • Pencil-icon inline editor in the recent-sessions list — Enter or blur saves, Esc cancels, optimistic update with revert + toast on error
  • Drive-by graph fix: SVG `fill=` doesn't resolve CSS variables, so the `var(--c-sage)` fallback rendered nodes black when a course had no color. Adds `paletteFor(seed)` in `lib/data.ts`, wires it into Dashboard / Tree / KnowledgeGraph fallbacks, and bumps subject-root radius 22→28
  • 6 new pytest cases covering happy path, validation, auth, missing-session, and pending-session paths

Test plan

  • `python3 -m pytest backend/tests/test_learn_routes.py -q` — 24 passing
  • `npx tsc --noEmit` in `frontend/` — clean
  • Manual: rename a real session in the Learn sidebar, refresh, confirm persisted name
  • Manual: rename a pending (not-yet-persisted) session and confirm subsequent chat write keeps the new name
  • Manual: try empty / >120-char names and confirm graceful failure
  • Manual: load Dashboard / Tree with a course missing `course_color` and confirm nodes render with a stable hue (not black)

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Session renaming: Users can now rename session topics directly from the session list with inline editing and real-time updates.
    • Input validation ensures topic names are between 1-120 characters.
    • Failed rename attempts automatically rollback to the previous topic.
    • Enhanced visual styling with improved color palette support for knowledge graphs.

Adds PATCH /api/learn/sessions/{id} to rename a session's topic
(handles in-memory pending sessions too) and an inline-edit affordance
in the recent-sessions list with optimistic update + revert on error.

Closes #91

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 5, 2026

Warning

Rate limit exceeded

@Jose-Gael-Cruz-Lopez has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 39 minutes and 46 seconds before requesting another review.

To continue reviewing without waiting, purchase usage credits in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: cae233ec-4150-496c-9161-b8236c761f09

📥 Commits

Reviewing files that changed from the base of the PR and between a6a70b5 and 8824a6e.

📒 Files selected for processing (7)
  • backend/models/__init__.py
  • backend/routes/learn.py
  • backend/tests/test_learn_routes.py
  • frontend/src/components/screens/Dashboard.tsx
  • frontend/src/components/screens/Learn.tsx
  • frontend/src/components/screens/Tree.tsx
  • frontend/src/lib/api.ts
📝 Walkthrough

Walkthrough

Adds session renaming: backend model and PATCH endpoint; frontend API helper, inline rename UI in Learn with optimistic updates and rollback; tests for rename flows. Also introduces a deterministic paletteFor color utility and adjusts graph node color/radius usages.

Changes

Session Renaming Feature

Layer / File(s) Summary
Data Shape
backend/models/__init__.py
New RenameSessionBody(BaseModel) with user_id: str and topic: str.
Backend Endpoint
backend/routes/learn.py
Added PATCH /sessions/{session_id} endpoint; validates topic length (1–120), updates pending in-memory payload or persisted session with ownership check, returns updated flag and session.
Tests
backend/tests/test_learn_routes.py
TestRenameSession suite covering persisted rename, pending-session rename, empty/too-long topic validation (400), wrong user (403), missing session (404).
Frontend API Helper
frontend/src/lib/api.ts
Added renameSession(sessionId, userId, topic) that PATCHes /api/learn/sessions/${sessionId} with { user_id, topic } and returns { updated, session }.
Frontend UI & Wiring
frontend/src/components/screens/Learn.tsx
Added handleRenameSession with optimistic UI update and rollback, confirmedTopicsRef bootstrap, SessionRow extension with inline editing state, Enter/Escape handling, and onRename prop wired into Recent sessions render.

Deterministic Color Palette & Graph UI Tweaks

Layer / File(s) Summary
New Utility
frontend/src/lib/data.ts
Added COURSE_PALETTE and exported `paletteFor(seed: string
Graph Color Usage
frontend/src/components/screens/Dashboard.tsx, frontend/src/components/screens/Tree.tsx, frontend/src/components/KnowledgeGraph.tsx
Replaced CSS-variable fallback with palette-derived hex color (via paletteFor) in color resolution; KnowledgeGraph increased root node radius (22→28) and ensured hex-based color handling and shadeFor usage.
Imports / Types
frontend/src/components/...
Updated imports to include paletteFor and use type GraphNode, type GraphEdge where applicable.

Sequence Diagram

sequenceDiagram
    participant User as User
    participant UI as Learn Component
    participant API as Frontend API
    participant Server as Backend API
    participant DB as Database

    User->>UI: Edit session topic, press Enter
    UI->>API: renameSession(sessionId, userId, newTopic)
    API->>Server: PATCH /api/learn/sessions/{sessionId} {user_id, topic}
    alt pending session
        Server->>Server: Update in-memory PENDING_SESSIONS payload
        Server-->>API: { updated: true, session }
    else persisted session
        Server->>Server: Validate ownership
        Server->>DB: Update session topic
        DB-->>Server: Confirm update
        Server-->>API: { updated: true, session }
    end
    API-->>UI: Response with updated session
    UI->>UI: Commit optimistic update or rollback on failure
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • SaplingLearn/Sapling#92: modifies KnowledgeGraph color resolution logic similarly; related at code-level for graph color defaults.

Poem

🐰 I nudge the topic, tap Enter with cheer,
The server nods, the change appears.
Palette hues now steady and sure,
Sessions rename — the flow is pure.
Hop, commit, and rollback — all clear!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(learn): make tutor session names editable' accurately summarizes the main change—adding session renaming capability to the Learn feature.
Description check ✅ Passed The description covers all key aspects: summary of changes, test plan with passing results, related issue #91, and notes about manual testing steps.
Linked Issues check ✅ Passed The PR successfully implements the requirements from issue #91: adds PATCH endpoint for session renaming, provides inline editor UI with validation, and includes comprehensive backend tests.
Out of Scope Changes check ✅ Passed All changes are directly related to #91 objectives. The paletteFor utility and graph color fixes are supporting changes needed for proper graph rendering with the new functionality.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/editable-session-names

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented May 5, 2026

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
frontend 8824a6e Commit Preview URL

Branch Preview URL
May 06 2026, 02:09 AM

SVG presentation attributes (fill=) don't resolve CSS custom properties,
so a missing per-course color fell through to var(--c-sage) and rendered
as black. Adds a deterministic hex palette + paletteFor(seed) helper and
wires it into the Dashboard, Tree, and KnowledgeGraph fallbacks. Also
bumps subject-root radius from 22 to 28 so course family centers stand
out from concept nodes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
backend/tests/test_learn_routes.py (1)

286-374: ⚡ Quick win

Coverage gap: pending-session 403 path is untested.

The endpoint has a separate ownership branch for pending sessions (routes/learn.py lines 471–472) that returns 403 when pending["user_id"] != body.user_id. The current suite covers the 403 path only for persisted sessions; consider adding a pending-session counterpart so that branch is exercised.

A test for the 120-char boundary (exactly 120 should succeed) would also be a cheap addition.

🧪 Proposed additional tests
def test_pending_wrong_user_returns_403(self):
    from routes.learn import PENDING_SESSIONS
    PENDING_SESSIONS["pending-2"] = {
        "user_id": "owner",
        "topic": "Old",
        "mode": "socratic",
        "assistant_reply": "hi",
    }
    try:
        r = client.patch(
            "/api/learn/sessions/pending-2",
            json={"user_id": "intruder", "topic": "Renamed"},
        )
        assert r.status_code == 403
        assert PENDING_SESSIONS["pending-2"]["topic"] == "Old"
    finally:
        PENDING_SESSIONS.pop("pending-2", None)

def test_topic_at_120_char_boundary_succeeds(self):
    sessions_mock = MagicMock()
    sessions_mock.select.return_value = [{"user_id": "u1"}]

    def factory(name):
        if name == "sessions":
            return sessions_mock
        m = MagicMock()
        m.select.return_value = []
        return m

    with patch("routes.learn.table", side_effect=factory):
        r = client.patch(
            "/api/learn/sessions/s1",
            json={"user_id": "u1", "topic": "x" * 120},
        )
    assert r.status_code == 200
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/tests/test_learn_routes.py` around lines 286 - 374, Add two tests
under TestRenameSession: one named test_pending_wrong_user_returns_403 that sets
routes.learn.PENDING_SESSIONS["pending-2"] = {... "user_id": "owner"...}, issues
client.patch to "/api/learn/sessions/pending-2" with body user_id "intruder" and
asserts 403 and that PENDING_SESSIONS["pending-2"]["topic"] remains unchanged,
cleaning up with PENDING_SESSIONS.pop in a finally block; and one named
test_topic_at_120_char_boundary_succeeds that mocks routes.learn.table like the
other persisted-session tests (use sessions_mock.select.return_value =
[{"user_id":"u1"}] and the factory used elsewhere), calls client.patch with
topic = "x"*120 and asserts status_code == 200. Ensure tests reference
PENDING_SESSIONS, client.patch, and the same mocking pattern used in existing
TestRenameSession tests.
frontend/src/components/screens/Learn.tsx (2)

815-832: 💤 Low value

Nit: dead disabled={editing} on the resume button.

Lines 816–831 only render this button in the !editing branch of the ternary, so disabled={editing} (line 818) is always false at render time. Safe to drop.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/screens/Learn.tsx` around lines 815 - 832, The resume
button rendered in the !editing branch includes a redundant disabled={editing}
prop that is always false; remove the disabled prop from the button JSX in the
Learn component (the element that calls onResume(s)) so the button is not passed
a dead prop and relies on the surrounding conditional instead.

783-814: ⚡ Quick win

Add an accessible label to the rename input.

When the pencil button is activated, focus moves to a bare <input> with no aria-label or associated <label>. Screen-reader users lose the context that this is the session topic field. The pencil button itself has aria-label="Rename session" but that label is lost once the button is replaced by the input.

♿ Proposed fix
           <input
             autoFocus
             value={draft}
             maxLength={120}
+            aria-label="Session topic"
             onChange={e => setDraft(e.target.value)}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/screens/Learn.tsx` around lines 783 - 814, The input
shown when editing a session topic lacks an accessible name; update the <input>
inside the editing branch in Learn.tsx to provide an accessible label (e.g., add
aria-label="Session topic" or aria-labelledby pointing to a hidden/visible label
element) so screen readers know this is the session/topic rename field; keep
existing handlers (onChange -> setDraft, onKeyDown -> commitEdit/cancelEdit,
onBlur -> commitEdit) intact and ensure the added label id is unique and
referenced so focus and semantics remain correct.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@backend/tests/test_learn_routes.py`:
- Around line 286-374: Add two tests under TestRenameSession: one named
test_pending_wrong_user_returns_403 that sets
routes.learn.PENDING_SESSIONS["pending-2"] = {... "user_id": "owner"...}, issues
client.patch to "/api/learn/sessions/pending-2" with body user_id "intruder" and
asserts 403 and that PENDING_SESSIONS["pending-2"]["topic"] remains unchanged,
cleaning up with PENDING_SESSIONS.pop in a finally block; and one named
test_topic_at_120_char_boundary_succeeds that mocks routes.learn.table like the
other persisted-session tests (use sessions_mock.select.return_value =
[{"user_id":"u1"}] and the factory used elsewhere), calls client.patch with
topic = "x"*120 and asserts status_code == 200. Ensure tests reference
PENDING_SESSIONS, client.patch, and the same mocking pattern used in existing
TestRenameSession tests.

In `@frontend/src/components/screens/Learn.tsx`:
- Around line 815-832: The resume button rendered in the !editing branch
includes a redundant disabled={editing} prop that is always false; remove the
disabled prop from the button JSX in the Learn component (the element that calls
onResume(s)) so the button is not passed a dead prop and relies on the
surrounding conditional instead.
- Around line 783-814: The input shown when editing a session topic lacks an
accessible name; update the <input> inside the editing branch in Learn.tsx to
provide an accessible label (e.g., add aria-label="Session topic" or
aria-labelledby pointing to a hidden/visible label element) so screen readers
know this is the session/topic rename field; keep existing handlers (onChange ->
setDraft, onKeyDown -> commitEdit/cancelEdit, onBlur -> commitEdit) intact and
ensure the added label id is unique and referenced so focus and semantics remain
correct.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ea29a994-a0b6-4198-89d1-e1ab42dc1756

📥 Commits

Reviewing files that changed from the base of the PR and between 3fb23d3 and d52ce7e.

📒 Files selected for processing (5)
  • backend/models/__init__.py
  • backend/routes/learn.py
  • backend/tests/test_learn_routes.py
  • frontend/src/components/screens/Learn.tsx
  • frontend/src/lib/api.ts

Jose-Gael-Cruz-Lopez and others added 3 commits May 5, 2026 18:22
- Esc no longer commits the rename. The blur fired by unmounting the input
  was running commitEdit with the typed draft still in its closure; guard
  with a cancellingRef so cancel skips the commit path.
- Stale revert on concurrent renames: only revert the optimistic value if
  it's still on screen, so a newer rename can't be clobbered by an older
  failed one.
- Drop dead `disabled={editing}` on the resume button (only rendered when
  editing is false).
- Harden paletteFor against -2^31 hash overflow that could yield an
  out-of-range index.
- Remove unused mock setup from the empty/too-long topic tests — the
  validation runs before any DB lookup.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- apiToGraphNode now uses paletteFor() for the color fallback to match
  Dashboard/Tree (var(--c-sage) doesn't resolve in SVG fill=).
- Added aria-label="Session name" to the rename input so screen readers
  announce a meaningful name.
- Track per-session confirmed topics in a ref and use that as the
  revert target. Fixes the edge case where two back-to-back rename
  failures left the UI stuck on the first-attempt value while the
  server held the original.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous revert-to-captured-topic approach was racy when two renames
overlapped: depending on which call's previousTopic was captured first
and which failed, the UI could end up out of sync with the server. Drop
the guess and ask the server for truth on failure — getSessions returns
the authoritative state, which we use to refresh both recentSessions and
the confirmed-topics ref. Also align the initial-load ref seed with the
same message_count > 0 filter we apply to recentSessions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
backend/tests/test_learn_routes.py (2)

312-329: 💤 Low value

PENDING_SESSIONS mutation leaks state if the test is interrupted before finally.

The finally block handles normal exceptions, but if the test process is killed (e.g., by a timeout or SIGKILL) the dict entry "pending-1" will persist in the module-level dict for any subsequently-run test in the same process. Using pytest's fixture scoping (e.g., an autouse fixture that clears PENDING_SESSIONS after each test) is safer. This is a minor concern for sequential runs but becomes a real issue with pytest-xdist or future parallelism.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/tests/test_learn_routes.py` around lines 312 - 329, The test
test_renames_pending_session mutates the module-level PENDING_SESSIONS dict and
relies on a finally to pop the key, which can leak state if the process is
killed; change the test to avoid global mutation by isolating or restoring state
via a pytest fixture or monkeypatch: create an autouse fixture (or use
monkeypatch) that saves a copy of routes.learn.PENDING_SESSIONS before the test
and restores/clears it after each test (or temporarily replace PENDING_SESSIONS
with a fresh dict for the duration of test_renames_pending_session) so no
entries persist across tests.

331-343: ⚡ Quick win

Validation tests bypass auth but may silently depend on require_self being a no-op.

test_empty_topic_returns_400 and test_topic_too_long_returns_400 send requests with no auth headers and no table mock. Per the route handler, require_self(body.user_id, request) is called before the topic validation. If require_self ever starts enforcing auth in the test environment (e.g., when middleware or test config changes), these tests will return 401/403 instead of 400, creating a silent false-pass today.

Add a require_self mock to pin the intent:

🛡️ Proposed fix
     def test_empty_topic_returns_400(self):
+        with patch("routes.learn.require_self"):
             r = client.patch(
                 "/api/learn/sessions/s1",
                 json={"user_id": "u1", "topic": "   "},
             )
         assert r.status_code == 400

     def test_topic_too_long_returns_400(self):
+        with patch("routes.learn.require_self"):
             r = client.patch(
                 "/api/learn/sessions/s1",
                 json={"user_id": "u1", "topic": "x" * 121},
             )
         assert r.status_code == 400
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/tests/test_learn_routes.py` around lines 331 - 343, The two tests
(test_empty_topic_returns_400 and test_topic_too_long_returns_400) currently
omit auth and can break if require_self stops being a no-op; mock require_self
in these tests so it always allows the call (e.g., patch or monkeypatch the
require_self function used by the learn session PATCH handler to a stub that
returns None/does nothing) before making the client.patch request to ensure the
route's topic validation is exercised and the response remains 400 regardless of
auth middleware changes.
frontend/src/components/screens/Tree.tsx (1)

26-42: ⚡ Quick win

Consider extracting apiToGraphNode to a shared helper.

This exact function is now duplicated in Tree.tsx, Dashboard.tsx, and Learn.tsx. Any future tweak to the color/fallback chain or mastery_tier mapping has to be done in three places (this PR already had to touch all three). A small helper in @/lib/data (or @/lib/api) keeping the same signature would consolidate the logic.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/screens/Tree.tsx` around lines 26 - 42,
apiToGraphNode is duplicated across Tree.tsx, Dashboard.tsx, and Learn.tsx;
extract it into a single shared helper (e.g., export a function apiToGraphNode
with the same signature from a new module in `@/lib/data` or `@/lib/api`), move the
logic exactly as-is (preserving color fallback chain, mastery_tier mapping, and
returned GraphNode shape), update Tree.tsx, Dashboard.tsx, and Learn.tsx to
import and use the shared apiToGraphNode, and remove the local copies so future
changes are made in one place.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/src/components/screens/Learn.tsx`:
- Around line 225-240: The rollback uses a stale previousTopic captured at
submit time; change handleRenameSession so you keep the optimistic
setRecentSessions and call renameSession as-is, but move the lookup of the
revert target into the catch handler by reading
confirmedTopicsRef.current.get(s.id) ?? s.topic (instead of using the
previousTopic captured before the try); on failure use setRecentSessions to
revert only if the session still has the optimistic topic (same conditional) and
keep updating confirmedTopicsRef.current.set(s.id, trimmed) on success as
before.

---

Nitpick comments:
In `@backend/tests/test_learn_routes.py`:
- Around line 312-329: The test test_renames_pending_session mutates the
module-level PENDING_SESSIONS dict and relies on a finally to pop the key, which
can leak state if the process is killed; change the test to avoid global
mutation by isolating or restoring state via a pytest fixture or monkeypatch:
create an autouse fixture (or use monkeypatch) that saves a copy of
routes.learn.PENDING_SESSIONS before the test and restores/clears it after each
test (or temporarily replace PENDING_SESSIONS with a fresh dict for the duration
of test_renames_pending_session) so no entries persist across tests.
- Around line 331-343: The two tests (test_empty_topic_returns_400 and
test_topic_too_long_returns_400) currently omit auth and can break if
require_self stops being a no-op; mock require_self in these tests so it always
allows the call (e.g., patch or monkeypatch the require_self function used by
the learn session PATCH handler to a stub that returns None/does nothing) before
making the client.patch request to ensure the route's topic validation is
exercised and the response remains 400 regardless of auth middleware changes.

In `@frontend/src/components/screens/Tree.tsx`:
- Around line 26-42: apiToGraphNode is duplicated across Tree.tsx,
Dashboard.tsx, and Learn.tsx; extract it into a single shared helper (e.g.,
export a function apiToGraphNode with the same signature from a new module in
`@/lib/data` or `@/lib/api`), move the logic exactly as-is (preserving color
fallback chain, mastery_tier mapping, and returned GraphNode shape), update
Tree.tsx, Dashboard.tsx, and Learn.tsx to import and use the shared
apiToGraphNode, and remove the local copies so future changes are made in one
place.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2d36f329-7ce6-474b-969b-fe605bef07c3

📥 Commits

Reviewing files that changed from the base of the PR and between d52ce7e and a6a70b5.

📒 Files selected for processing (6)
  • backend/tests/test_learn_routes.py
  • frontend/src/components/KnowledgeGraph.tsx
  • frontend/src/components/screens/Dashboard.tsx
  • frontend/src/components/screens/Learn.tsx
  • frontend/src/components/screens/Tree.tsx
  • frontend/src/lib/data.ts

Comment thread frontend/src/components/screens/Learn.tsx
…-names

# Conflicts:
#	backend/tests/test_learn_routes.py
#	frontend/src/components/KnowledgeGraph.tsx
@Jose-Gael-Cruz-Lopez Jose-Gael-Cruz-Lopez merged commit b98bce9 into main May 6, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make tutor session names editable

1 participant