AI Session Interface Update for Knowledge Graph - #333

Merged
Darkest-Teddy merged 9 commits into
mainfrom
staging
Jul 10, 2026
Merged

AI Session Interface Update for Knowledge Graph#333
Darkest-Teddy merged 9 commits into
mainfrom
staging

Conversation

@Darkest-Teddy

@Darkest-TeddyDarkest-Teddy commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Collapsible draggable knowledge-map rail on the Tutor session

Makes the right-hand knowledge-map panel on the active Tutor session collapsible via a draggable edge tab. Desktop-only affordance; the mobile graph tab path is unchanged. Scoped to Learn.tsx plus a one-line globals.css rule.

What changed

  • Collapsible railrailOpen state (default open), persisted to localStorage["sapling_learn_rail_open"] and hydrated on mount, so it survives reloads.
  • Sliding animation — rail widened from 320px → 400px; width/min-width animate 0 ↔ 400 with the existing --dur/--ease tokens (cubic-bezier(0.2,0.7,0.2,1)). The <aside> stays mounted with overflow: hidden; inner content is pinned at a fixed 400px so it clips cleanly during the slide (and the graph's measured bounds stay stable). Reduced-motion is already handled by the global rule at globals.css:416.
  • Draggable edge tab — 24×68 pill on the conversation/rail seam. Knowledge-graph glyph (3 nodes + 2 links) over a chevron that rotates 180° between states; --brand-forest when open, --text-muted when collapsed. Click toggles; pointer-drag moves the width live within [0, 400] (transition disabled mid-drag) and snaps open/closed at the 200px midpoint. A <4px press counts as a click. aria-label/aria-expanded/title set.
  • Graph un-boxed — removed the white card wrapper so the graph floats on the transparent rail. The graph itself was already transparent; KnowledgeGraph/KnowledgeGraph2D and the force simulation are untouched — no re-parameterization, same ResizeObserver sizing.
  • Recenter control — hidden on the Learn rail only, via a scoped .learn-map-rail button[title="Reset view"] { display: none } rule. The shared KnowledgeGraph2D is not modified, so Dashboard/Tree keep their recenter button. Zoom +/ and the 2D badge remain.

Notes / deviations from spec

  • The recenter button lives in the sharedKnowledgeGraph2D (used by Dashboard + Tree), which the spec said not to modify — so it's suppressed with a scoped CSS rule rather than removed from the component. Tradeoff: the selector keys off the button's title="Reset view". Happy to switch to an opt-in hideRecenter prop if preferred.
  • No globals.css keyframe/reduced-motion addition was needed — the global reduced-motion rule already neutralizes the new transitions.

Verification

  • npm run lint0 errors (only pre-existing warnings).
  • npm run typecheck → clean for the changed files. (The 6 .next/dev/types/validator.ts errors are pre-existing stale local artifacts — confirmed identical with these changes stashed — and won't appear on a clean CI checkout.)
  • Not yet verified visually in a running app.

Summary by CodeRabbit

  • New Features

    • Concept scanning now uses an improved AI-powered process to identify new concepts, while preserving existing results and response behavior.
    • Added a collapsible, draggable knowledge-map rail in Tutor sessions.
    • The rail remembers its open or closed state between visits and snaps smoothly while resizing.
  • UI Improvements

    • Removed the KnowledgeGraph “Reset view” control from the Tutor session rail while keeping it available elsewhere.

Darkest-Teddyand others added 8 commits July 8, 2026 22:31
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the right-hand knowledge-map panel on the active Tutor session
collapsible via a draggable edge tab (desktop only):
- railOpen state persisted to localStorage (sapling_learn_rail_open),
hydrated on mount
- rail widened to 400px; width/min-width slide 0<->400 via --dur/--ease,
aside kept mounted with overflow:hidden (reduced-motion covered by the
existing global rule)
- edge tab: knowledge-graph glyph + rotating chevron, brand-forest when
open / text-muted when collapsed; click toggles, pointer-drag moves the
width live and snaps at the halfway point (<4px press = click)
- strip the white card around the graph so it floats on the transparent
rail; KnowledgeGraph/physics untouched
- hide the shared graph recenter control on the Learn rail only via a
scoped .learn-map-rail CSS rule (Dashboard/Tree keep it)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Jul 10, 2026

Copy link
Copy Markdown

Deploying with Cloudflare Workers Cloudflare Workers

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

StatusNameLatest CommitPreview URLUpdated (UTC)
✅ Deployment successful!
View logs
frontend-staging8bce5b0Commit Preview URL

Branch Preview URL
Jul 10 2026, 01:19 AM

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Darkest-Teddy, you've reached your PR review limit, so we couldn't start this review.

Next review available in:36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ace8064-3f77-4a93-9b10-698619b4d3f6

📥 Commits

Reviewing files that changed from the base of the PR and between 91f8ee1 and 8bce5b0.

📒 Files selected for processing (1)
  • frontend/src/components/screens/Learn.tsx
📝 Walkthrough

Walkthrough

The PR adds a typed, agent-first concept scan with legacy fallback and regression tests. It also adds a persistent, draggable desktop knowledge-map rail in Tutor sessions and hides its reset control.

Changes

Concept scan agent migration

Layer / File(s)Summary
Agent contract and provider registration
backend/agents/_providers.py, backend/agents/concept_scan.py, docs/superpowers/...
Registers the concept_scan task, defines the bounded NewConcepts output model, configures the agent, and documents the migration design.
Agent-first route dispatch
backend/routes/documents.py, docs/superpowers/...
Builds scan input, invokes the typed agent, falls back to the legacy implementation on failures, and preserves downstream response handling.
Agent and endpoint validation
backend/tests/test_concept_scan.py, docs/superpowers/...
Tests model selection, schema validation, prompt construction, agent results, fallback behavior, and endpoint response fields.

Knowledge-map rail interaction

Layer / File(s)Summary
Persistent rail state and pointer interaction
frontend/src/components/screens/Learn.tsx
Adds persisted open state, pointer capture, drag threshold handling, width snapping, and derived rail layout state.
Rail layout and controls
frontend/src/components/screens/Learn.tsx, frontend/src/app/globals.css
Updates clipping, sizing, transitions, toggle placement, and scoped hiding of the reset control.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Title check✅ PassedThe title is concise and broadly matches the PR’s main theme: a knowledge-graph UI update in the session view.
Description check✅ PassedThe description is detailed and mostly complete, but it doesn’t follow the required template sections and omits a linked issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 407-415: Update onRailTabPointerUp and the pointercancel routing
around the rail tab so cancelled gestures abort without toggling or snapping the
rail. Track whether the event is a cancellation and verify the active pointer
belongs to the current drag before committing; on cancellation or mismatched
pointer, release/clear drag state and return without calling setRailOpen.
- Around line 703-712: Make the knowledge-map rail toggle button
keyboard-operable by adding a keyboard handler to the button rendered in Learn,
activating the same toggle action used by the pointer interaction for Enter and
Space while preventing default Space behavior; preserve the existing pointer
drag handlers and avoid triggering the action for other keys.
- Line 113: Update the hydration tracking in the Learn component: replace the
useRef-based railHydrated flag with state, set it to true only after the stored
collapsed state has been applied, and gate the persistence effect on that state
so it cannot write the initial value before hydration completes.
🪄 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: a0d54f59-ddf2-4369-99f5-1593582d704a

📥 Commits

Reviewing files that changed from the base of the PR and between f08c37a and 91f8ee1.

📒 Files selected for processing (8)
  • backend/agents/_providers.py
  • backend/agents/concept_scan.py
  • backend/routes/documents.py
  • backend/tests/test_concept_scan.py
  • docs/superpowers/plans/2026-07-08-scan-concepts-agent-migration.md
  • docs/superpowers/specs/2026-07-08-scan-concepts-agent-migration-design.md
  • frontend/src/app/globals.css
  • frontend/src/components/screens/Learn.tsx

Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Address code-review findings on the collapsible knowledge-map rail:
- track hydration with state (not a ref) so the persist effect is gated
until the stored collapsed state is applied, preventing the initial
value from clobbering storage on mount
- route pointercancel through a shared drag terminator that verifies the
pointer id and aborts without toggling/snapping on cancellation
- make the edge tab keyboard-operable: Enter/Space toggle the rail
(Space default prevented), pointer drag handlers preserved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Darkest-Teddy
Darkest-Teddy merged commit 426a704 into mainJul 10, 2026
6 checks passed
Sign up for freeto 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.

1 participant

@Darkest-Teddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

AI Session Interface Update for Knowledge Graph - #333

Merged
Darkest-Teddy merged 9 commits into
mainfrom
staging
Jul 10, 2026
Merged

AI Session Interface Update for Knowledge Graph#333
Darkest-Teddy merged 9 commits into
mainfrom
staging

Conversation

@Darkest-Teddy

@Darkest-TeddyDarkest-Teddy commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Collapsible draggable knowledge-map rail on the Tutor session

Makes the right-hand knowledge-map panel on the active Tutor session collapsible via a draggable edge tab. Desktop-only affordance; the mobile graph tab path is unchanged. Scoped to Learn.tsx plus a one-line globals.css rule.

What changed

  • Collapsible railrailOpen state (default open), persisted to localStorage["sapling_learn_rail_open"] and hydrated on mount, so it survives reloads.
  • Sliding animation — rail widened from 320px → 400px; width/min-width animate 0 ↔ 400 with the existing --dur/--ease tokens (cubic-bezier(0.2,0.7,0.2,1)). The <aside> stays mounted with overflow: hidden; inner content is pinned at a fixed 400px so it clips cleanly during the slide (and the graph's measured bounds stay stable). Reduced-motion is already handled by the global rule at globals.css:416.
  • Draggable edge tab — 24×68 pill on the conversation/rail seam. Knowledge-graph glyph (3 nodes + 2 links) over a chevron that rotates 180° between states; --brand-forest when open, --text-muted when collapsed. Click toggles; pointer-drag moves the width live within [0, 400] (transition disabled mid-drag) and snaps open/closed at the 200px midpoint. A <4px press counts as a click. aria-label/aria-expanded/title set.
  • Graph un-boxed — removed the white card wrapper so the graph floats on the transparent rail. The graph itself was already transparent; KnowledgeGraph/KnowledgeGraph2D and the force simulation are untouched — no re-parameterization, same ResizeObserver sizing.
  • Recenter control — hidden on the Learn rail only, via a scoped .learn-map-rail button[title="Reset view"] { display: none } rule. The shared KnowledgeGraph2D is not modified, so Dashboard/Tree keep their recenter button. Zoom +/ and the 2D badge remain.

Notes / deviations from spec

  • The recenter button lives in the sharedKnowledgeGraph2D (used by Dashboard + Tree), which the spec said not to modify — so it's suppressed with a scoped CSS rule rather than removed from the component. Tradeoff: the selector keys off the button's title="Reset view". Happy to switch to an opt-in hideRecenter prop if preferred.
  • No globals.css keyframe/reduced-motion addition was needed — the global reduced-motion rule already neutralizes the new transitions.

Verification

  • npm run lint0 errors (only pre-existing warnings).
  • npm run typecheck → clean for the changed files. (The 6 .next/dev/types/validator.ts errors are pre-existing stale local artifacts — confirmed identical with these changes stashed — and won't appear on a clean CI checkout.)
  • Not yet verified visually in a running app.

Summary by CodeRabbit

  • New Features

    • Concept scanning now uses an improved AI-powered process to identify new concepts, while preserving existing results and response behavior.
    • Added a collapsible, draggable knowledge-map rail in Tutor sessions.
    • The rail remembers its open or closed state between visits and snaps smoothly while resizing.
  • UI Improvements

    • Removed the KnowledgeGraph “Reset view” control from the Tutor session rail while keeping it available elsewhere.

Darkest-Teddyand others added 8 commits July 8, 2026 22:31
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the right-hand knowledge-map panel on the active Tutor session
collapsible via a draggable edge tab (desktop only):
- railOpen state persisted to localStorage (sapling_learn_rail_open),
hydrated on mount
- rail widened to 400px; width/min-width slide 0<->400 via --dur/--ease,
aside kept mounted with overflow:hidden (reduced-motion covered by the
existing global rule)
- edge tab: knowledge-graph glyph + rotating chevron, brand-forest when
open / text-muted when collapsed; click toggles, pointer-drag moves the
width live and snaps at the halfway point (<4px press = click)
- strip the white card around the graph so it floats on the transparent
rail; KnowledgeGraph/physics untouched
- hide the shared graph recenter control on the Learn rail only via a
scoped .learn-map-rail CSS rule (Dashboard/Tree keep it)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Jul 10, 2026

Copy link
Copy Markdown

Deploying with Cloudflare Workers Cloudflare Workers

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

StatusNameLatest CommitPreview URLUpdated (UTC)
✅ Deployment successful!
View logs
frontend-staging8bce5b0Commit Preview URL

Branch Preview URL
Jul 10 2026, 01:19 AM

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Darkest-Teddy, you've reached your PR review limit, so we couldn't start this review.

Next review available in:36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ace8064-3f77-4a93-9b10-698619b4d3f6

📥 Commits

Reviewing files that changed from the base of the PR and between 91f8ee1 and 8bce5b0.

📒 Files selected for processing (1)
  • frontend/src/components/screens/Learn.tsx
📝 Walkthrough

Walkthrough

The PR adds a typed, agent-first concept scan with legacy fallback and regression tests. It also adds a persistent, draggable desktop knowledge-map rail in Tutor sessions and hides its reset control.

Changes

Concept scan agent migration

Layer / File(s)Summary
Agent contract and provider registration
backend/agents/_providers.py, backend/agents/concept_scan.py, docs/superpowers/...
Registers the concept_scan task, defines the bounded NewConcepts output model, configures the agent, and documents the migration design.
Agent-first route dispatch
backend/routes/documents.py, docs/superpowers/...
Builds scan input, invokes the typed agent, falls back to the legacy implementation on failures, and preserves downstream response handling.
Agent and endpoint validation
backend/tests/test_concept_scan.py, docs/superpowers/...
Tests model selection, schema validation, prompt construction, agent results, fallback behavior, and endpoint response fields.

Knowledge-map rail interaction

Layer / File(s)Summary
Persistent rail state and pointer interaction
frontend/src/components/screens/Learn.tsx
Adds persisted open state, pointer capture, drag threshold handling, width snapping, and derived rail layout state.
Rail layout and controls
frontend/src/components/screens/Learn.tsx, frontend/src/app/globals.css
Updates clipping, sizing, transitions, toggle placement, and scoped hiding of the reset control.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Title check✅ PassedThe title is concise and broadly matches the PR’s main theme: a knowledge-graph UI update in the session view.
Description check✅ PassedThe description is detailed and mostly complete, but it doesn’t follow the required template sections and omits a linked issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 407-415: Update onRailTabPointerUp and the pointercancel routing
around the rail tab so cancelled gestures abort without toggling or snapping the
rail. Track whether the event is a cancellation and verify the active pointer
belongs to the current drag before committing; on cancellation or mismatched
pointer, release/clear drag state and return without calling setRailOpen.
- Around line 703-712: Make the knowledge-map rail toggle button
keyboard-operable by adding a keyboard handler to the button rendered in Learn,
activating the same toggle action used by the pointer interaction for Enter and
Space while preventing default Space behavior; preserve the existing pointer
drag handlers and avoid triggering the action for other keys.
- Line 113: Update the hydration tracking in the Learn component: replace the
useRef-based railHydrated flag with state, set it to true only after the stored
collapsed state has been applied, and gate the persistence effect on that state
so it cannot write the initial value before hydration completes.
🪄 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: a0d54f59-ddf2-4369-99f5-1593582d704a

📥 Commits

Reviewing files that changed from the base of the PR and between f08c37a and 91f8ee1.

📒 Files selected for processing (8)
  • backend/agents/_providers.py
  • backend/agents/concept_scan.py
  • backend/routes/documents.py
  • backend/tests/test_concept_scan.py
  • docs/superpowers/plans/2026-07-08-scan-concepts-agent-migration.md
  • docs/superpowers/specs/2026-07-08-scan-concepts-agent-migration-design.md
  • frontend/src/app/globals.css
  • frontend/src/components/screens/Learn.tsx

Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Address code-review findings on the collapsible knowledge-map rail:
- track hydration with state (not a ref) so the persist effect is gated
until the stored collapsed state is applied, preventing the initial
value from clobbering storage on mount
- route pointercancel through a shared drag terminator that verifies the
pointer id and aborts without toggling/snapping on cancellation
- make the edge tab keyboard-operable: Enter/Space toggle the rail
(Space default prevented), pointer drag handlers preserved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Darkest-Teddy
Darkest-Teddy merged commit 426a704 into mainJul 10, 2026
6 checks passed
Sign up for freeto 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.

1 participant

@Darkest-Teddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

AI Session Interface Update for Knowledge Graph - #333

Merged
Darkest-Teddy merged 9 commits into
mainfrom
staging
Jul 10, 2026
Merged

AI Session Interface Update for Knowledge Graph#333
Darkest-Teddy merged 9 commits into
mainfrom
staging

Conversation

@Darkest-Teddy

@Darkest-TeddyDarkest-Teddy commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Collapsible draggable knowledge-map rail on the Tutor session

Makes the right-hand knowledge-map panel on the active Tutor session collapsible via a draggable edge tab. Desktop-only affordance; the mobile graph tab path is unchanged. Scoped to Learn.tsx plus a one-line globals.css rule.

What changed

  • Collapsible railrailOpen state (default open), persisted to localStorage["sapling_learn_rail_open"] and hydrated on mount, so it survives reloads.
  • Sliding animation — rail widened from 320px → 400px; width/min-width animate 0 ↔ 400 with the existing --dur/--ease tokens (cubic-bezier(0.2,0.7,0.2,1)). The <aside> stays mounted with overflow: hidden; inner content is pinned at a fixed 400px so it clips cleanly during the slide (and the graph's measured bounds stay stable). Reduced-motion is already handled by the global rule at globals.css:416.
  • Draggable edge tab — 24×68 pill on the conversation/rail seam. Knowledge-graph glyph (3 nodes + 2 links) over a chevron that rotates 180° between states; --brand-forest when open, --text-muted when collapsed. Click toggles; pointer-drag moves the width live within [0, 400] (transition disabled mid-drag) and snaps open/closed at the 200px midpoint. A <4px press counts as a click. aria-label/aria-expanded/title set.
  • Graph un-boxed — removed the white card wrapper so the graph floats on the transparent rail. The graph itself was already transparent; KnowledgeGraph/KnowledgeGraph2D and the force simulation are untouched — no re-parameterization, same ResizeObserver sizing.
  • Recenter control — hidden on the Learn rail only, via a scoped .learn-map-rail button[title="Reset view"] { display: none } rule. The shared KnowledgeGraph2D is not modified, so Dashboard/Tree keep their recenter button. Zoom +/ and the 2D badge remain.

Notes / deviations from spec

  • The recenter button lives in the sharedKnowledgeGraph2D (used by Dashboard + Tree), which the spec said not to modify — so it's suppressed with a scoped CSS rule rather than removed from the component. Tradeoff: the selector keys off the button's title="Reset view". Happy to switch to an opt-in hideRecenter prop if preferred.
  • No globals.css keyframe/reduced-motion addition was needed — the global reduced-motion rule already neutralizes the new transitions.

Verification

  • npm run lint0 errors (only pre-existing warnings).
  • npm run typecheck → clean for the changed files. (The 6 .next/dev/types/validator.ts errors are pre-existing stale local artifacts — confirmed identical with these changes stashed — and won't appear on a clean CI checkout.)
  • Not yet verified visually in a running app.

Summary by CodeRabbit

  • New Features

    • Concept scanning now uses an improved AI-powered process to identify new concepts, while preserving existing results and response behavior.
    • Added a collapsible, draggable knowledge-map rail in Tutor sessions.
    • The rail remembers its open or closed state between visits and snaps smoothly while resizing.
  • UI Improvements

    • Removed the KnowledgeGraph “Reset view” control from the Tutor session rail while keeping it available elsewhere.

Darkest-Teddyand others added 8 commits July 8, 2026 22:31
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the right-hand knowledge-map panel on the active Tutor session
collapsible via a draggable edge tab (desktop only):
- railOpen state persisted to localStorage (sapling_learn_rail_open),
hydrated on mount
- rail widened to 400px; width/min-width slide 0<->400 via --dur/--ease,
aside kept mounted with overflow:hidden (reduced-motion covered by the
existing global rule)
- edge tab: knowledge-graph glyph + rotating chevron, brand-forest when
open / text-muted when collapsed; click toggles, pointer-drag moves the
width live and snaps at the halfway point (<4px press = click)
- strip the white card around the graph so it floats on the transparent
rail; KnowledgeGraph/physics untouched
- hide the shared graph recenter control on the Learn rail only via a
scoped .learn-map-rail CSS rule (Dashboard/Tree keep it)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Jul 10, 2026

Copy link
Copy Markdown

Deploying with Cloudflare Workers Cloudflare Workers

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

StatusNameLatest CommitPreview URLUpdated (UTC)
✅ Deployment successful!
View logs
frontend-staging8bce5b0Commit Preview URL

Branch Preview URL
Jul 10 2026, 01:19 AM

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Darkest-Teddy, you've reached your PR review limit, so we couldn't start this review.

Next review available in:36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ace8064-3f77-4a93-9b10-698619b4d3f6

📥 Commits

Reviewing files that changed from the base of the PR and between 91f8ee1 and 8bce5b0.

📒 Files selected for processing (1)
  • frontend/src/components/screens/Learn.tsx
📝 Walkthrough

Walkthrough

The PR adds a typed, agent-first concept scan with legacy fallback and regression tests. It also adds a persistent, draggable desktop knowledge-map rail in Tutor sessions and hides its reset control.

Changes

Concept scan agent migration

Layer / File(s)Summary
Agent contract and provider registration
backend/agents/_providers.py, backend/agents/concept_scan.py, docs/superpowers/...
Registers the concept_scan task, defines the bounded NewConcepts output model, configures the agent, and documents the migration design.
Agent-first route dispatch
backend/routes/documents.py, docs/superpowers/...
Builds scan input, invokes the typed agent, falls back to the legacy implementation on failures, and preserves downstream response handling.
Agent and endpoint validation
backend/tests/test_concept_scan.py, docs/superpowers/...
Tests model selection, schema validation, prompt construction, agent results, fallback behavior, and endpoint response fields.

Knowledge-map rail interaction

Layer / File(s)Summary
Persistent rail state and pointer interaction
frontend/src/components/screens/Learn.tsx
Adds persisted open state, pointer capture, drag threshold handling, width snapping, and derived rail layout state.
Rail layout and controls
frontend/src/components/screens/Learn.tsx, frontend/src/app/globals.css
Updates clipping, sizing, transitions, toggle placement, and scoped hiding of the reset control.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Title check✅ PassedThe title is concise and broadly matches the PR’s main theme: a knowledge-graph UI update in the session view.
Description check✅ PassedThe description is detailed and mostly complete, but it doesn’t follow the required template sections and omits a linked issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 407-415: Update onRailTabPointerUp and the pointercancel routing
around the rail tab so cancelled gestures abort without toggling or snapping the
rail. Track whether the event is a cancellation and verify the active pointer
belongs to the current drag before committing; on cancellation or mismatched
pointer, release/clear drag state and return without calling setRailOpen.
- Around line 703-712: Make the knowledge-map rail toggle button
keyboard-operable by adding a keyboard handler to the button rendered in Learn,
activating the same toggle action used by the pointer interaction for Enter and
Space while preventing default Space behavior; preserve the existing pointer
drag handlers and avoid triggering the action for other keys.
- Line 113: Update the hydration tracking in the Learn component: replace the
useRef-based railHydrated flag with state, set it to true only after the stored
collapsed state has been applied, and gate the persistence effect on that state
so it cannot write the initial value before hydration completes.
🪄 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: a0d54f59-ddf2-4369-99f5-1593582d704a

📥 Commits

Reviewing files that changed from the base of the PR and between f08c37a and 91f8ee1.

📒 Files selected for processing (8)
  • backend/agents/_providers.py
  • backend/agents/concept_scan.py
  • backend/routes/documents.py
  • backend/tests/test_concept_scan.py
  • docs/superpowers/plans/2026-07-08-scan-concepts-agent-migration.md
  • docs/superpowers/specs/2026-07-08-scan-concepts-agent-migration-design.md
  • frontend/src/app/globals.css
  • frontend/src/components/screens/Learn.tsx

Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Address code-review findings on the collapsible knowledge-map rail:
- track hydration with state (not a ref) so the persist effect is gated
until the stored collapsed state is applied, preventing the initial
value from clobbering storage on mount
- route pointercancel through a shared drag terminator that verifies the
pointer id and aborts without toggling/snapping on cancellation
- make the edge tab keyboard-operable: Enter/Space toggle the rail
(Space default prevented), pointer drag handlers preserved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Darkest-Teddy
Darkest-Teddy merged commit 426a704 into mainJul 10, 2026
6 checks passed
Sign up for freeto 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.

1 participant

@Darkest-Teddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

AI Session Interface Update for Knowledge Graph - #333

Merged
Darkest-Teddy merged 9 commits into
mainfrom
staging
Jul 10, 2026
Merged

AI Session Interface Update for Knowledge Graph#333
Darkest-Teddy merged 9 commits into
mainfrom
staging

Conversation

@Darkest-Teddy

@Darkest-TeddyDarkest-Teddy commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Collapsible draggable knowledge-map rail on the Tutor session

Makes the right-hand knowledge-map panel on the active Tutor session collapsible via a draggable edge tab. Desktop-only affordance; the mobile graph tab path is unchanged. Scoped to Learn.tsx plus a one-line globals.css rule.

What changed

  • Collapsible railrailOpen state (default open), persisted to localStorage["sapling_learn_rail_open"] and hydrated on mount, so it survives reloads.
  • Sliding animation — rail widened from 320px → 400px; width/min-width animate 0 ↔ 400 with the existing --dur/--ease tokens (cubic-bezier(0.2,0.7,0.2,1)). The <aside> stays mounted with overflow: hidden; inner content is pinned at a fixed 400px so it clips cleanly during the slide (and the graph's measured bounds stay stable). Reduced-motion is already handled by the global rule at globals.css:416.
  • Draggable edge tab — 24×68 pill on the conversation/rail seam. Knowledge-graph glyph (3 nodes + 2 links) over a chevron that rotates 180° between states; --brand-forest when open, --text-muted when collapsed. Click toggles; pointer-drag moves the width live within [0, 400] (transition disabled mid-drag) and snaps open/closed at the 200px midpoint. A <4px press counts as a click. aria-label/aria-expanded/title set.
  • Graph un-boxed — removed the white card wrapper so the graph floats on the transparent rail. The graph itself was already transparent; KnowledgeGraph/KnowledgeGraph2D and the force simulation are untouched — no re-parameterization, same ResizeObserver sizing.
  • Recenter control — hidden on the Learn rail only, via a scoped .learn-map-rail button[title="Reset view"] { display: none } rule. The shared KnowledgeGraph2D is not modified, so Dashboard/Tree keep their recenter button. Zoom +/ and the 2D badge remain.

Notes / deviations from spec

  • The recenter button lives in the sharedKnowledgeGraph2D (used by Dashboard + Tree), which the spec said not to modify — so it's suppressed with a scoped CSS rule rather than removed from the component. Tradeoff: the selector keys off the button's title="Reset view". Happy to switch to an opt-in hideRecenter prop if preferred.
  • No globals.css keyframe/reduced-motion addition was needed — the global reduced-motion rule already neutralizes the new transitions.

Verification

  • npm run lint0 errors (only pre-existing warnings).
  • npm run typecheck → clean for the changed files. (The 6 .next/dev/types/validator.ts errors are pre-existing stale local artifacts — confirmed identical with these changes stashed — and won't appear on a clean CI checkout.)
  • Not yet verified visually in a running app.

Summary by CodeRabbit

  • New Features

    • Concept scanning now uses an improved AI-powered process to identify new concepts, while preserving existing results and response behavior.
    • Added a collapsible, draggable knowledge-map rail in Tutor sessions.
    • The rail remembers its open or closed state between visits and snaps smoothly while resizing.
  • UI Improvements

    • Removed the KnowledgeGraph “Reset view” control from the Tutor session rail while keeping it available elsewhere.

Darkest-Teddyand others added 8 commits July 8, 2026 22:31
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the right-hand knowledge-map panel on the active Tutor session
collapsible via a draggable edge tab (desktop only):
- railOpen state persisted to localStorage (sapling_learn_rail_open),
hydrated on mount
- rail widened to 400px; width/min-width slide 0<->400 via --dur/--ease,
aside kept mounted with overflow:hidden (reduced-motion covered by the
existing global rule)
- edge tab: knowledge-graph glyph + rotating chevron, brand-forest when
open / text-muted when collapsed; click toggles, pointer-drag moves the
width live and snaps at the halfway point (<4px press = click)
- strip the white card around the graph so it floats on the transparent
rail; KnowledgeGraph/physics untouched
- hide the shared graph recenter control on the Learn rail only via a
scoped .learn-map-rail CSS rule (Dashboard/Tree keep it)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Jul 10, 2026

Copy link
Copy Markdown

Deploying with Cloudflare Workers Cloudflare Workers

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

StatusNameLatest CommitPreview URLUpdated (UTC)
✅ Deployment successful!
View logs
frontend-staging8bce5b0Commit Preview URL

Branch Preview URL
Jul 10 2026, 01:19 AM

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Darkest-Teddy, you've reached your PR review limit, so we couldn't start this review.

Next review available in:36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ace8064-3f77-4a93-9b10-698619b4d3f6

📥 Commits

Reviewing files that changed from the base of the PR and between 91f8ee1 and 8bce5b0.

📒 Files selected for processing (1)
  • frontend/src/components/screens/Learn.tsx
📝 Walkthrough

Walkthrough

The PR adds a typed, agent-first concept scan with legacy fallback and regression tests. It also adds a persistent, draggable desktop knowledge-map rail in Tutor sessions and hides its reset control.

Changes

Concept scan agent migration

Layer / File(s)Summary
Agent contract and provider registration
backend/agents/_providers.py, backend/agents/concept_scan.py, docs/superpowers/...
Registers the concept_scan task, defines the bounded NewConcepts output model, configures the agent, and documents the migration design.
Agent-first route dispatch
backend/routes/documents.py, docs/superpowers/...
Builds scan input, invokes the typed agent, falls back to the legacy implementation on failures, and preserves downstream response handling.
Agent and endpoint validation
backend/tests/test_concept_scan.py, docs/superpowers/...
Tests model selection, schema validation, prompt construction, agent results, fallback behavior, and endpoint response fields.

Knowledge-map rail interaction

Layer / File(s)Summary
Persistent rail state and pointer interaction
frontend/src/components/screens/Learn.tsx
Adds persisted open state, pointer capture, drag threshold handling, width snapping, and derived rail layout state.
Rail layout and controls
frontend/src/components/screens/Learn.tsx, frontend/src/app/globals.css
Updates clipping, sizing, transitions, toggle placement, and scoped hiding of the reset control.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Title check✅ PassedThe title is concise and broadly matches the PR’s main theme: a knowledge-graph UI update in the session view.
Description check✅ PassedThe description is detailed and mostly complete, but it doesn’t follow the required template sections and omits a linked issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 407-415: Update onRailTabPointerUp and the pointercancel routing
around the rail tab so cancelled gestures abort without toggling or snapping the
rail. Track whether the event is a cancellation and verify the active pointer
belongs to the current drag before committing; on cancellation or mismatched
pointer, release/clear drag state and return without calling setRailOpen.
- Around line 703-712: Make the knowledge-map rail toggle button
keyboard-operable by adding a keyboard handler to the button rendered in Learn,
activating the same toggle action used by the pointer interaction for Enter and
Space while preventing default Space behavior; preserve the existing pointer
drag handlers and avoid triggering the action for other keys.
- Line 113: Update the hydration tracking in the Learn component: replace the
useRef-based railHydrated flag with state, set it to true only after the stored
collapsed state has been applied, and gate the persistence effect on that state
so it cannot write the initial value before hydration completes.
🪄 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: a0d54f59-ddf2-4369-99f5-1593582d704a

📥 Commits

Reviewing files that changed from the base of the PR and between f08c37a and 91f8ee1.

📒 Files selected for processing (8)
  • backend/agents/_providers.py
  • backend/agents/concept_scan.py
  • backend/routes/documents.py
  • backend/tests/test_concept_scan.py
  • docs/superpowers/plans/2026-07-08-scan-concepts-agent-migration.md
  • docs/superpowers/specs/2026-07-08-scan-concepts-agent-migration-design.md
  • frontend/src/app/globals.css
  • frontend/src/components/screens/Learn.tsx

Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Address code-review findings on the collapsible knowledge-map rail:
- track hydration with state (not a ref) so the persist effect is gated
until the stored collapsed state is applied, preventing the initial
value from clobbering storage on mount
- route pointercancel through a shared drag terminator that verifies the
pointer id and aborts without toggling/snapping on cancellation
- make the edge tab keyboard-operable: Enter/Space toggle the rail
(Space default prevented), pointer drag handlers preserved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Darkest-Teddy
Darkest-Teddy merged commit 426a704 into mainJul 10, 2026
6 checks passed
Sign up for freeto 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.

1 participant

@Darkest-Teddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

AI Session Interface Update for Knowledge Graph - #333

Merged
Darkest-Teddy merged 9 commits into
mainfrom
staging
Jul 10, 2026
Merged

AI Session Interface Update for Knowledge Graph#333
Darkest-Teddy merged 9 commits into
mainfrom
staging

Conversation

@Darkest-Teddy

@Darkest-TeddyDarkest-Teddy commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Collapsible draggable knowledge-map rail on the Tutor session

Makes the right-hand knowledge-map panel on the active Tutor session collapsible via a draggable edge tab. Desktop-only affordance; the mobile graph tab path is unchanged. Scoped to Learn.tsx plus a one-line globals.css rule.

What changed

  • Collapsible railrailOpen state (default open), persisted to localStorage["sapling_learn_rail_open"] and hydrated on mount, so it survives reloads.
  • Sliding animation — rail widened from 320px → 400px; width/min-width animate 0 ↔ 400 with the existing --dur/--ease tokens (cubic-bezier(0.2,0.7,0.2,1)). The <aside> stays mounted with overflow: hidden; inner content is pinned at a fixed 400px so it clips cleanly during the slide (and the graph's measured bounds stay stable). Reduced-motion is already handled by the global rule at globals.css:416.
  • Draggable edge tab — 24×68 pill on the conversation/rail seam. Knowledge-graph glyph (3 nodes + 2 links) over a chevron that rotates 180° between states; --brand-forest when open, --text-muted when collapsed. Click toggles; pointer-drag moves the width live within [0, 400] (transition disabled mid-drag) and snaps open/closed at the 200px midpoint. A <4px press counts as a click. aria-label/aria-expanded/title set.
  • Graph un-boxed — removed the white card wrapper so the graph floats on the transparent rail. The graph itself was already transparent; KnowledgeGraph/KnowledgeGraph2D and the force simulation are untouched — no re-parameterization, same ResizeObserver sizing.
  • Recenter control — hidden on the Learn rail only, via a scoped .learn-map-rail button[title="Reset view"] { display: none } rule. The shared KnowledgeGraph2D is not modified, so Dashboard/Tree keep their recenter button. Zoom +/ and the 2D badge remain.

Notes / deviations from spec

  • The recenter button lives in the sharedKnowledgeGraph2D (used by Dashboard + Tree), which the spec said not to modify — so it's suppressed with a scoped CSS rule rather than removed from the component. Tradeoff: the selector keys off the button's title="Reset view". Happy to switch to an opt-in hideRecenter prop if preferred.
  • No globals.css keyframe/reduced-motion addition was needed — the global reduced-motion rule already neutralizes the new transitions.

Verification

  • npm run lint0 errors (only pre-existing warnings).
  • npm run typecheck → clean for the changed files. (The 6 .next/dev/types/validator.ts errors are pre-existing stale local artifacts — confirmed identical with these changes stashed — and won't appear on a clean CI checkout.)
  • Not yet verified visually in a running app.

Summary by CodeRabbit

  • New Features

    • Concept scanning now uses an improved AI-powered process to identify new concepts, while preserving existing results and response behavior.
    • Added a collapsible, draggable knowledge-map rail in Tutor sessions.
    • The rail remembers its open or closed state between visits and snaps smoothly while resizing.
  • UI Improvements

    • Removed the KnowledgeGraph “Reset view” control from the Tutor session rail while keeping it available elsewhere.

Darkest-Teddyand others added 8 commits July 8, 2026 22:31
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the right-hand knowledge-map panel on the active Tutor session
collapsible via a draggable edge tab (desktop only):
- railOpen state persisted to localStorage (sapling_learn_rail_open),
hydrated on mount
- rail widened to 400px; width/min-width slide 0<->400 via --dur/--ease,
aside kept mounted with overflow:hidden (reduced-motion covered by the
existing global rule)
- edge tab: knowledge-graph glyph + rotating chevron, brand-forest when
open / text-muted when collapsed; click toggles, pointer-drag moves the
width live and snaps at the halfway point (<4px press = click)
- strip the white card around the graph so it floats on the transparent
rail; KnowledgeGraph/physics untouched
- hide the shared graph recenter control on the Learn rail only via a
scoped .learn-map-rail CSS rule (Dashboard/Tree keep it)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Jul 10, 2026

Copy link
Copy Markdown

Deploying with Cloudflare Workers Cloudflare Workers

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

StatusNameLatest CommitPreview URLUpdated (UTC)
✅ Deployment successful!
View logs
frontend-staging8bce5b0Commit Preview URL

Branch Preview URL
Jul 10 2026, 01:19 AM

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Darkest-Teddy, you've reached your PR review limit, so we couldn't start this review.

Next review available in:36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ace8064-3f77-4a93-9b10-698619b4d3f6

📥 Commits

Reviewing files that changed from the base of the PR and between 91f8ee1 and 8bce5b0.

📒 Files selected for processing (1)
  • frontend/src/components/screens/Learn.tsx
📝 Walkthrough

Walkthrough

The PR adds a typed, agent-first concept scan with legacy fallback and regression tests. It also adds a persistent, draggable desktop knowledge-map rail in Tutor sessions and hides its reset control.

Changes

Concept scan agent migration

Layer / File(s)Summary
Agent contract and provider registration
backend/agents/_providers.py, backend/agents/concept_scan.py, docs/superpowers/...
Registers the concept_scan task, defines the bounded NewConcepts output model, configures the agent, and documents the migration design.
Agent-first route dispatch
backend/routes/documents.py, docs/superpowers/...
Builds scan input, invokes the typed agent, falls back to the legacy implementation on failures, and preserves downstream response handling.
Agent and endpoint validation
backend/tests/test_concept_scan.py, docs/superpowers/...
Tests model selection, schema validation, prompt construction, agent results, fallback behavior, and endpoint response fields.

Knowledge-map rail interaction

Layer / File(s)Summary
Persistent rail state and pointer interaction
frontend/src/components/screens/Learn.tsx
Adds persisted open state, pointer capture, drag threshold handling, width snapping, and derived rail layout state.
Rail layout and controls
frontend/src/components/screens/Learn.tsx, frontend/src/app/globals.css
Updates clipping, sizing, transitions, toggle placement, and scoped hiding of the reset control.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Title check✅ PassedThe title is concise and broadly matches the PR’s main theme: a knowledge-graph UI update in the session view.
Description check✅ PassedThe description is detailed and mostly complete, but it doesn’t follow the required template sections and omits a linked issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 407-415: Update onRailTabPointerUp and the pointercancel routing
around the rail tab so cancelled gestures abort without toggling or snapping the
rail. Track whether the event is a cancellation and verify the active pointer
belongs to the current drag before committing; on cancellation or mismatched
pointer, release/clear drag state and return without calling setRailOpen.
- Around line 703-712: Make the knowledge-map rail toggle button
keyboard-operable by adding a keyboard handler to the button rendered in Learn,
activating the same toggle action used by the pointer interaction for Enter and
Space while preventing default Space behavior; preserve the existing pointer
drag handlers and avoid triggering the action for other keys.
- Line 113: Update the hydration tracking in the Learn component: replace the
useRef-based railHydrated flag with state, set it to true only after the stored
collapsed state has been applied, and gate the persistence effect on that state
so it cannot write the initial value before hydration completes.
🪄 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: a0d54f59-ddf2-4369-99f5-1593582d704a

📥 Commits

Reviewing files that changed from the base of the PR and between f08c37a and 91f8ee1.

📒 Files selected for processing (8)
  • backend/agents/_providers.py
  • backend/agents/concept_scan.py
  • backend/routes/documents.py
  • backend/tests/test_concept_scan.py
  • docs/superpowers/plans/2026-07-08-scan-concepts-agent-migration.md
  • docs/superpowers/specs/2026-07-08-scan-concepts-agent-migration-design.md
  • frontend/src/app/globals.css
  • frontend/src/components/screens/Learn.tsx

Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Address code-review findings on the collapsible knowledge-map rail:
- track hydration with state (not a ref) so the persist effect is gated
until the stored collapsed state is applied, preventing the initial
value from clobbering storage on mount
- route pointercancel through a shared drag terminator that verifies the
pointer id and aborts without toggling/snapping on cancellation
- make the edge tab keyboard-operable: Enter/Space toggle the rail
(Space default prevented), pointer drag handlers preserved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Darkest-Teddy
Darkest-Teddy merged commit 426a704 into mainJul 10, 2026
6 checks passed
Sign up for freeto 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.

1 participant

@Darkest-Teddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

AI Session Interface Update for Knowledge Graph - #333

Merged
Darkest-Teddy merged 9 commits into
mainfrom
staging
Jul 10, 2026
Merged

AI Session Interface Update for Knowledge Graph#333
Darkest-Teddy merged 9 commits into
mainfrom
staging

Conversation

@Darkest-Teddy

@Darkest-TeddyDarkest-Teddy commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Collapsible draggable knowledge-map rail on the Tutor session

Makes the right-hand knowledge-map panel on the active Tutor session collapsible via a draggable edge tab. Desktop-only affordance; the mobile graph tab path is unchanged. Scoped to Learn.tsx plus a one-line globals.css rule.

What changed

  • Collapsible railrailOpen state (default open), persisted to localStorage["sapling_learn_rail_open"] and hydrated on mount, so it survives reloads.
  • Sliding animation — rail widened from 320px → 400px; width/min-width animate 0 ↔ 400 with the existing --dur/--ease tokens (cubic-bezier(0.2,0.7,0.2,1)). The <aside> stays mounted with overflow: hidden; inner content is pinned at a fixed 400px so it clips cleanly during the slide (and the graph's measured bounds stay stable). Reduced-motion is already handled by the global rule at globals.css:416.
  • Draggable edge tab — 24×68 pill on the conversation/rail seam. Knowledge-graph glyph (3 nodes + 2 links) over a chevron that rotates 180° between states; --brand-forest when open, --text-muted when collapsed. Click toggles; pointer-drag moves the width live within [0, 400] (transition disabled mid-drag) and snaps open/closed at the 200px midpoint. A <4px press counts as a click. aria-label/aria-expanded/title set.
  • Graph un-boxed — removed the white card wrapper so the graph floats on the transparent rail. The graph itself was already transparent; KnowledgeGraph/KnowledgeGraph2D and the force simulation are untouched — no re-parameterization, same ResizeObserver sizing.
  • Recenter control — hidden on the Learn rail only, via a scoped .learn-map-rail button[title="Reset view"] { display: none } rule. The shared KnowledgeGraph2D is not modified, so Dashboard/Tree keep their recenter button. Zoom +/ and the 2D badge remain.

Notes / deviations from spec

  • The recenter button lives in the sharedKnowledgeGraph2D (used by Dashboard + Tree), which the spec said not to modify — so it's suppressed with a scoped CSS rule rather than removed from the component. Tradeoff: the selector keys off the button's title="Reset view". Happy to switch to an opt-in hideRecenter prop if preferred.
  • No globals.css keyframe/reduced-motion addition was needed — the global reduced-motion rule already neutralizes the new transitions.

Verification

  • npm run lint0 errors (only pre-existing warnings).
  • npm run typecheck → clean for the changed files. (The 6 .next/dev/types/validator.ts errors are pre-existing stale local artifacts — confirmed identical with these changes stashed — and won't appear on a clean CI checkout.)
  • Not yet verified visually in a running app.

Summary by CodeRabbit

  • New Features

    • Concept scanning now uses an improved AI-powered process to identify new concepts, while preserving existing results and response behavior.
    • Added a collapsible, draggable knowledge-map rail in Tutor sessions.
    • The rail remembers its open or closed state between visits and snaps smoothly while resizing.
  • UI Improvements

    • Removed the KnowledgeGraph “Reset view” control from the Tutor session rail while keeping it available elsewhere.

Darkest-Teddyand others added 8 commits July 8, 2026 22:31
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the right-hand knowledge-map panel on the active Tutor session
collapsible via a draggable edge tab (desktop only):
- railOpen state persisted to localStorage (sapling_learn_rail_open),
hydrated on mount
- rail widened to 400px; width/min-width slide 0<->400 via --dur/--ease,
aside kept mounted with overflow:hidden (reduced-motion covered by the
existing global rule)
- edge tab: knowledge-graph glyph + rotating chevron, brand-forest when
open / text-muted when collapsed; click toggles, pointer-drag moves the
width live and snaps at the halfway point (<4px press = click)
- strip the white card around the graph so it floats on the transparent
rail; KnowledgeGraph/physics untouched
- hide the shared graph recenter control on the Learn rail only via a
scoped .learn-map-rail CSS rule (Dashboard/Tree keep it)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Jul 10, 2026

Copy link
Copy Markdown

Deploying with Cloudflare Workers Cloudflare Workers

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

StatusNameLatest CommitPreview URLUpdated (UTC)
✅ Deployment successful!
View logs
frontend-staging8bce5b0Commit Preview URL

Branch Preview URL
Jul 10 2026, 01:19 AM

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Darkest-Teddy, you've reached your PR review limit, so we couldn't start this review.

Next review available in:36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ace8064-3f77-4a93-9b10-698619b4d3f6

📥 Commits

Reviewing files that changed from the base of the PR and between 91f8ee1 and 8bce5b0.

📒 Files selected for processing (1)
  • frontend/src/components/screens/Learn.tsx
📝 Walkthrough

Walkthrough

The PR adds a typed, agent-first concept scan with legacy fallback and regression tests. It also adds a persistent, draggable desktop knowledge-map rail in Tutor sessions and hides its reset control.

Changes

Concept scan agent migration

Layer / File(s)Summary
Agent contract and provider registration
backend/agents/_providers.py, backend/agents/concept_scan.py, docs/superpowers/...
Registers the concept_scan task, defines the bounded NewConcepts output model, configures the agent, and documents the migration design.
Agent-first route dispatch
backend/routes/documents.py, docs/superpowers/...
Builds scan input, invokes the typed agent, falls back to the legacy implementation on failures, and preserves downstream response handling.
Agent and endpoint validation
backend/tests/test_concept_scan.py, docs/superpowers/...
Tests model selection, schema validation, prompt construction, agent results, fallback behavior, and endpoint response fields.

Knowledge-map rail interaction

Layer / File(s)Summary
Persistent rail state and pointer interaction
frontend/src/components/screens/Learn.tsx
Adds persisted open state, pointer capture, drag threshold handling, width snapping, and derived rail layout state.
Rail layout and controls
frontend/src/components/screens/Learn.tsx, frontend/src/app/globals.css
Updates clipping, sizing, transitions, toggle placement, and scoped hiding of the reset control.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Title check✅ PassedThe title is concise and broadly matches the PR’s main theme: a knowledge-graph UI update in the session view.
Description check✅ PassedThe description is detailed and mostly complete, but it doesn’t follow the required template sections and omits a linked issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 407-415: Update onRailTabPointerUp and the pointercancel routing
around the rail tab so cancelled gestures abort without toggling or snapping the
rail. Track whether the event is a cancellation and verify the active pointer
belongs to the current drag before committing; on cancellation or mismatched
pointer, release/clear drag state and return without calling setRailOpen.
- Around line 703-712: Make the knowledge-map rail toggle button
keyboard-operable by adding a keyboard handler to the button rendered in Learn,
activating the same toggle action used by the pointer interaction for Enter and
Space while preventing default Space behavior; preserve the existing pointer
drag handlers and avoid triggering the action for other keys.
- Line 113: Update the hydration tracking in the Learn component: replace the
useRef-based railHydrated flag with state, set it to true only after the stored
collapsed state has been applied, and gate the persistence effect on that state
so it cannot write the initial value before hydration completes.
🪄 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: a0d54f59-ddf2-4369-99f5-1593582d704a

📥 Commits

Reviewing files that changed from the base of the PR and between f08c37a and 91f8ee1.

📒 Files selected for processing (8)
  • backend/agents/_providers.py
  • backend/agents/concept_scan.py
  • backend/routes/documents.py
  • backend/tests/test_concept_scan.py
  • docs/superpowers/plans/2026-07-08-scan-concepts-agent-migration.md
  • docs/superpowers/specs/2026-07-08-scan-concepts-agent-migration-design.md
  • frontend/src/app/globals.css
  • frontend/src/components/screens/Learn.tsx

Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Address code-review findings on the collapsible knowledge-map rail:
- track hydration with state (not a ref) so the persist effect is gated
until the stored collapsed state is applied, preventing the initial
value from clobbering storage on mount
- route pointercancel through a shared drag terminator that verifies the
pointer id and aborts without toggling/snapping on cancellation
- make the edge tab keyboard-operable: Enter/Space toggle the rail
(Space default prevented), pointer drag handlers preserved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Darkest-Teddy
Darkest-Teddy merged commit 426a704 into mainJul 10, 2026
6 checks passed
Sign up for freeto 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.

1 participant

@Darkest-Teddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

AI Session Interface Update for Knowledge Graph - #333

Merged
Darkest-Teddy merged 9 commits into
mainfrom
staging
Jul 10, 2026
Merged

AI Session Interface Update for Knowledge Graph#333
Darkest-Teddy merged 9 commits into
mainfrom
staging

Conversation

@Darkest-Teddy

@Darkest-TeddyDarkest-Teddy commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Collapsible draggable knowledge-map rail on the Tutor session

Makes the right-hand knowledge-map panel on the active Tutor session collapsible via a draggable edge tab. Desktop-only affordance; the mobile graph tab path is unchanged. Scoped to Learn.tsx plus a one-line globals.css rule.

What changed

  • Collapsible railrailOpen state (default open), persisted to localStorage["sapling_learn_rail_open"] and hydrated on mount, so it survives reloads.
  • Sliding animation — rail widened from 320px → 400px; width/min-width animate 0 ↔ 400 with the existing --dur/--ease tokens (cubic-bezier(0.2,0.7,0.2,1)). The <aside> stays mounted with overflow: hidden; inner content is pinned at a fixed 400px so it clips cleanly during the slide (and the graph's measured bounds stay stable). Reduced-motion is already handled by the global rule at globals.css:416.
  • Draggable edge tab — 24×68 pill on the conversation/rail seam. Knowledge-graph glyph (3 nodes + 2 links) over a chevron that rotates 180° between states; --brand-forest when open, --text-muted when collapsed. Click toggles; pointer-drag moves the width live within [0, 400] (transition disabled mid-drag) and snaps open/closed at the 200px midpoint. A <4px press counts as a click. aria-label/aria-expanded/title set.
  • Graph un-boxed — removed the white card wrapper so the graph floats on the transparent rail. The graph itself was already transparent; KnowledgeGraph/KnowledgeGraph2D and the force simulation are untouched — no re-parameterization, same ResizeObserver sizing.
  • Recenter control — hidden on the Learn rail only, via a scoped .learn-map-rail button[title="Reset view"] { display: none } rule. The shared KnowledgeGraph2D is not modified, so Dashboard/Tree keep their recenter button. Zoom +/ and the 2D badge remain.

Notes / deviations from spec

  • The recenter button lives in the sharedKnowledgeGraph2D (used by Dashboard + Tree), which the spec said not to modify — so it's suppressed with a scoped CSS rule rather than removed from the component. Tradeoff: the selector keys off the button's title="Reset view". Happy to switch to an opt-in hideRecenter prop if preferred.
  • No globals.css keyframe/reduced-motion addition was needed — the global reduced-motion rule already neutralizes the new transitions.

Verification

  • npm run lint0 errors (only pre-existing warnings).
  • npm run typecheck → clean for the changed files. (The 6 .next/dev/types/validator.ts errors are pre-existing stale local artifacts — confirmed identical with these changes stashed — and won't appear on a clean CI checkout.)
  • Not yet verified visually in a running app.

Summary by CodeRabbit

  • New Features

    • Concept scanning now uses an improved AI-powered process to identify new concepts, while preserving existing results and response behavior.
    • Added a collapsible, draggable knowledge-map rail in Tutor sessions.
    • The rail remembers its open or closed state between visits and snaps smoothly while resizing.
  • UI Improvements

    • Removed the KnowledgeGraph “Reset view” control from the Tutor session rail while keeping it available elsewhere.

Darkest-Teddyand others added 8 commits July 8, 2026 22:31
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the right-hand knowledge-map panel on the active Tutor session
collapsible via a draggable edge tab (desktop only):
- railOpen state persisted to localStorage (sapling_learn_rail_open),
hydrated on mount
- rail widened to 400px; width/min-width slide 0<->400 via --dur/--ease,
aside kept mounted with overflow:hidden (reduced-motion covered by the
existing global rule)
- edge tab: knowledge-graph glyph + rotating chevron, brand-forest when
open / text-muted when collapsed; click toggles, pointer-drag moves the
width live and snaps at the halfway point (<4px press = click)
- strip the white card around the graph so it floats on the transparent
rail; KnowledgeGraph/physics untouched
- hide the shared graph recenter control on the Learn rail only via a
scoped .learn-map-rail CSS rule (Dashboard/Tree keep it)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Jul 10, 2026

Copy link
Copy Markdown

Deploying with Cloudflare Workers Cloudflare Workers

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

StatusNameLatest CommitPreview URLUpdated (UTC)
✅ Deployment successful!
View logs
frontend-staging8bce5b0Commit Preview URL

Branch Preview URL
Jul 10 2026, 01:19 AM

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Darkest-Teddy, you've reached your PR review limit, so we couldn't start this review.

Next review available in:36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ace8064-3f77-4a93-9b10-698619b4d3f6

📥 Commits

Reviewing files that changed from the base of the PR and between 91f8ee1 and 8bce5b0.

📒 Files selected for processing (1)
  • frontend/src/components/screens/Learn.tsx
📝 Walkthrough

Walkthrough

The PR adds a typed, agent-first concept scan with legacy fallback and regression tests. It also adds a persistent, draggable desktop knowledge-map rail in Tutor sessions and hides its reset control.

Changes

Concept scan agent migration

Layer / File(s)Summary
Agent contract and provider registration
backend/agents/_providers.py, backend/agents/concept_scan.py, docs/superpowers/...
Registers the concept_scan task, defines the bounded NewConcepts output model, configures the agent, and documents the migration design.
Agent-first route dispatch
backend/routes/documents.py, docs/superpowers/...
Builds scan input, invokes the typed agent, falls back to the legacy implementation on failures, and preserves downstream response handling.
Agent and endpoint validation
backend/tests/test_concept_scan.py, docs/superpowers/...
Tests model selection, schema validation, prompt construction, agent results, fallback behavior, and endpoint response fields.

Knowledge-map rail interaction

Layer / File(s)Summary
Persistent rail state and pointer interaction
frontend/src/components/screens/Learn.tsx
Adds persisted open state, pointer capture, drag threshold handling, width snapping, and derived rail layout state.
Rail layout and controls
frontend/src/components/screens/Learn.tsx, frontend/src/app/globals.css
Updates clipping, sizing, transitions, toggle placement, and scoped hiding of the reset control.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Title check✅ PassedThe title is concise and broadly matches the PR’s main theme: a knowledge-graph UI update in the session view.
Description check✅ PassedThe description is detailed and mostly complete, but it doesn’t follow the required template sections and omits a linked issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 407-415: Update onRailTabPointerUp and the pointercancel routing
around the rail tab so cancelled gestures abort without toggling or snapping the
rail. Track whether the event is a cancellation and verify the active pointer
belongs to the current drag before committing; on cancellation or mismatched
pointer, release/clear drag state and return without calling setRailOpen.
- Around line 703-712: Make the knowledge-map rail toggle button
keyboard-operable by adding a keyboard handler to the button rendered in Learn,
activating the same toggle action used by the pointer interaction for Enter and
Space while preventing default Space behavior; preserve the existing pointer
drag handlers and avoid triggering the action for other keys.
- Line 113: Update the hydration tracking in the Learn component: replace the
useRef-based railHydrated flag with state, set it to true only after the stored
collapsed state has been applied, and gate the persistence effect on that state
so it cannot write the initial value before hydration completes.
🪄 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: a0d54f59-ddf2-4369-99f5-1593582d704a

📥 Commits

Reviewing files that changed from the base of the PR and between f08c37a and 91f8ee1.

📒 Files selected for processing (8)
  • backend/agents/_providers.py
  • backend/agents/concept_scan.py
  • backend/routes/documents.py
  • backend/tests/test_concept_scan.py
  • docs/superpowers/plans/2026-07-08-scan-concepts-agent-migration.md
  • docs/superpowers/specs/2026-07-08-scan-concepts-agent-migration-design.md
  • frontend/src/app/globals.css
  • frontend/src/components/screens/Learn.tsx

Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Address code-review findings on the collapsible knowledge-map rail:
- track hydration with state (not a ref) so the persist effect is gated
until the stored collapsed state is applied, preventing the initial
value from clobbering storage on mount
- route pointercancel through a shared drag terminator that verifies the
pointer id and aborts without toggling/snapping on cancellation
- make the edge tab keyboard-operable: Enter/Space toggle the rail
(Space default prevented), pointer drag handlers preserved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Darkest-Teddy
Darkest-Teddy merged commit 426a704 into mainJul 10, 2026
6 checks passed
Sign up for freeto 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.

1 participant

@Darkest-Teddy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

AI Session Interface Update for Knowledge Graph - #333

Merged
Darkest-Teddy merged 9 commits into
mainfrom
staging
Jul 10, 2026
Merged

AI Session Interface Update for Knowledge Graph#333
Darkest-Teddy merged 9 commits into
mainfrom
staging

Conversation

@Darkest-Teddy

@Darkest-TeddyDarkest-Teddy commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Collapsible draggable knowledge-map rail on the Tutor session

Makes the right-hand knowledge-map panel on the active Tutor session collapsible via a draggable edge tab. Desktop-only affordance; the mobile graph tab path is unchanged. Scoped to Learn.tsx plus a one-line globals.css rule.

What changed

  • Collapsible railrailOpen state (default open), persisted to localStorage["sapling_learn_rail_open"] and hydrated on mount, so it survives reloads.
  • Sliding animation — rail widened from 320px → 400px; width/min-width animate 0 ↔ 400 with the existing --dur/--ease tokens (cubic-bezier(0.2,0.7,0.2,1)). The <aside> stays mounted with overflow: hidden; inner content is pinned at a fixed 400px so it clips cleanly during the slide (and the graph's measured bounds stay stable). Reduced-motion is already handled by the global rule at globals.css:416.
  • Draggable edge tab — 24×68 pill on the conversation/rail seam. Knowledge-graph glyph (3 nodes + 2 links) over a chevron that rotates 180° between states; --brand-forest when open, --text-muted when collapsed. Click toggles; pointer-drag moves the width live within [0, 400] (transition disabled mid-drag) and snaps open/closed at the 200px midpoint. A <4px press counts as a click. aria-label/aria-expanded/title set.
  • Graph un-boxed — removed the white card wrapper so the graph floats on the transparent rail. The graph itself was already transparent; KnowledgeGraph/KnowledgeGraph2D and the force simulation are untouched — no re-parameterization, same ResizeObserver sizing.
  • Recenter control — hidden on the Learn rail only, via a scoped .learn-map-rail button[title="Reset view"] { display: none } rule. The shared KnowledgeGraph2D is not modified, so Dashboard/Tree keep their recenter button. Zoom +/ and the 2D badge remain.

Notes / deviations from spec

  • The recenter button lives in the sharedKnowledgeGraph2D (used by Dashboard + Tree), which the spec said not to modify — so it's suppressed with a scoped CSS rule rather than removed from the component. Tradeoff: the selector keys off the button's title="Reset view". Happy to switch to an opt-in hideRecenter prop if preferred.
  • No globals.css keyframe/reduced-motion addition was needed — the global reduced-motion rule already neutralizes the new transitions.

Verification

  • npm run lint0 errors (only pre-existing warnings).
  • npm run typecheck → clean for the changed files. (The 6 .next/dev/types/validator.ts errors are pre-existing stale local artifacts — confirmed identical with these changes stashed — and won't appear on a clean CI checkout.)
  • Not yet verified visually in a running app.

Summary by CodeRabbit

  • New Features

    • Concept scanning now uses an improved AI-powered process to identify new concepts, while preserving existing results and response behavior.
    • Added a collapsible, draggable knowledge-map rail in Tutor sessions.
    • The rail remembers its open or closed state between visits and snaps smoothly while resizing.
  • UI Improvements

    • Removed the KnowledgeGraph “Reset view” control from the Tutor session rail while keeping it available elsewhere.

Darkest-Teddyand others added 8 commits July 8, 2026 22:31
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the right-hand knowledge-map panel on the active Tutor session
collapsible via a draggable edge tab (desktop only):
- railOpen state persisted to localStorage (sapling_learn_rail_open),
hydrated on mount
- rail widened to 400px; width/min-width slide 0<->400 via --dur/--ease,
aside kept mounted with overflow:hidden (reduced-motion covered by the
existing global rule)
- edge tab: knowledge-graph glyph + rotating chevron, brand-forest when
open / text-muted when collapsed; click toggles, pointer-drag moves the
width live and snaps at the halfway point (<4px press = click)
- strip the white card around the graph so it floats on the transparent
rail; KnowledgeGraph/physics untouched
- hide the shared graph recenter control on the Learn rail only via a
scoped .learn-map-rail CSS rule (Dashboard/Tree keep it)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Jul 10, 2026

Copy link
Copy Markdown

Deploying with Cloudflare Workers Cloudflare Workers

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

StatusNameLatest CommitPreview URLUpdated (UTC)
✅ Deployment successful!
View logs
frontend-staging8bce5b0Commit Preview URL

Branch Preview URL
Jul 10 2026, 01:19 AM

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Darkest-Teddy, you've reached your PR review limit, so we couldn't start this review.

Next review available in:36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ace8064-3f77-4a93-9b10-698619b4d3f6

📥 Commits

Reviewing files that changed from the base of the PR and between 91f8ee1 and 8bce5b0.

📒 Files selected for processing (1)
  • frontend/src/components/screens/Learn.tsx
📝 Walkthrough

Walkthrough

The PR adds a typed, agent-first concept scan with legacy fallback and regression tests. It also adds a persistent, draggable desktop knowledge-map rail in Tutor sessions and hides its reset control.

Changes

Concept scan agent migration

Layer / File(s)Summary
Agent contract and provider registration
backend/agents/_providers.py, backend/agents/concept_scan.py, docs/superpowers/...
Registers the concept_scan task, defines the bounded NewConcepts output model, configures the agent, and documents the migration design.
Agent-first route dispatch
backend/routes/documents.py, docs/superpowers/...
Builds scan input, invokes the typed agent, falls back to the legacy implementation on failures, and preserves downstream response handling.
Agent and endpoint validation
backend/tests/test_concept_scan.py, docs/superpowers/...
Tests model selection, schema validation, prompt construction, agent results, fallback behavior, and endpoint response fields.

Knowledge-map rail interaction

Layer / File(s)Summary
Persistent rail state and pointer interaction
frontend/src/components/screens/Learn.tsx
Adds persisted open state, pointer capture, drag threshold handling, width snapping, and derived rail layout state.
Rail layout and controls
frontend/src/components/screens/Learn.tsx, frontend/src/app/globals.css
Updates clipping, sizing, transitions, toggle placement, and scoped hiding of the reset control.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Title check✅ PassedThe title is concise and broadly matches the PR’s main theme: a knowledge-graph UI update in the session view.
Description check✅ PassedThe description is detailed and mostly complete, but it doesn’t follow the required template sections and omits a linked issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 407-415: Update onRailTabPointerUp and the pointercancel routing
around the rail tab so cancelled gestures abort without toggling or snapping the
rail. Track whether the event is a cancellation and verify the active pointer
belongs to the current drag before committing; on cancellation or mismatched
pointer, release/clear drag state and return without calling setRailOpen.
- Around line 703-712: Make the knowledge-map rail toggle button
keyboard-operable by adding a keyboard handler to the button rendered in Learn,
activating the same toggle action used by the pointer interaction for Enter and
Space while preventing default Space behavior; preserve the existing pointer
drag handlers and avoid triggering the action for other keys.
- Line 113: Update the hydration tracking in the Learn component: replace the
useRef-based railHydrated flag with state, set it to true only after the stored
collapsed state has been applied, and gate the persistence effect on that state
so it cannot write the initial value before hydration completes.
🪄 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: a0d54f59-ddf2-4369-99f5-1593582d704a

📥 Commits

Reviewing files that changed from the base of the PR and between f08c37a and 91f8ee1.

📒 Files selected for processing (8)
  • backend/agents/_providers.py
  • backend/agents/concept_scan.py
  • backend/routes/documents.py
  • backend/tests/test_concept_scan.py
  • docs/superpowers/plans/2026-07-08-scan-concepts-agent-migration.md
  • docs/superpowers/specs/2026-07-08-scan-concepts-agent-migration-design.md
  • frontend/src/app/globals.css
  • frontend/src/components/screens/Learn.tsx

Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Comment threadfrontend/src/components/screens/Learn.tsx Outdated
Address code-review findings on the collapsible knowledge-map rail:
- track hydration with state (not a ref) so the persist effect is gated
until the stored collapsed state is applied, preventing the initial
value from clobbering storage on mount
- route pointercancel through a shared drag terminator that verifies the
pointer id and aborts without toggling/snapping on cancellation
- make the edge tab keyboard-operable: Enter/Space toggle the rail
(Space default prevented), pointer drag handlers preserved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Darkest-Teddy
Darkest-Teddy merged commit 426a704 into mainJul 10, 2026
6 checks passed
Sign up for freeto 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.

1 participant

@Darkest-Teddy