Skip to content

Rebrand to Anvay and add docs plus MCP setup#3

Merged
0xaeres merged 15 commits into
mainfrom
feature/ui-enhancement
Jun 24, 2026
Merged

Rebrand to Anvay and add docs plus MCP setup#3
0xaeres merged 15 commits into
mainfrom
feature/ui-enhancement

Conversation

@0xaeres

@0xaeres 0xaeres commented Jun 22, 2026

Copy link
Copy Markdown
Owner

Summary

  • Rebrand the UI from Nexus to Anvay across app chrome, public pages, docs, and metadata.
  • Add MCP client setup UX, consolidated product skills routes, docs navigation/search, and performance tooling.
  • Harden backend/API handling with retries, proxy session behavior, Tina fetch timeout, and bundle budget checks.

Validation

  • npm run build

Notes

  • Product scope remains rooted under /p/[product].
  • Humans still approve council proposals before skills become available.

@vercel

vercel Bot commented Jun 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
anvay-ui Ready Ready Preview, Comment Jun 24, 2026 4:41pm
nexus-ui Ready Ready Preview, Comment Jun 24, 2026 4:41pm

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR renames the product from Nexus to Anvay across all files, adds a SetupClient/McpSetupCard feature for MCP client configuration, introduces a WebVitalsReporter component for metrics reporting, adds backend-retry resilience to Shell, consolidates the skill route to /skills, removes ag-grid in favor of a custom PendingActionsTable, introduces a Tina-backed public docs system with Markdown table/rule/Mermaid support and Fuse.js search, and introduces a Lighthouse CI/bundle-budget performance monitoring pipeline.

Changes

Anvay UI: functional changes, rebrand, and performance tooling

Layer / File(s) Summary
API client, proxy hardening, and type extensions
lib/api/client.ts, app/api/anvay/[...path]/route.ts, proxy.ts, lib/types.ts
Switches HTTP client and proxy to ANVAY_API_URL with per-path AbortController timeouts, renames CSRF cookie/header to anvay_csrf/X-Anvay-CSRF, adds 503 error responses and structured ApiError distinction of timeouts vs network failures. Extends GraphRAGPath with seed_name/node_count/edge_count and GraphRAGAnswer with graph_relationships_used/graph_entity_count/graph_relationship_count/graph_diagnostics. Adds proxy.ts session validation (hasValidSession) to gate / requests by checking anvay_session against backend /me endpoint.
ProductContext products field and ProductSwitcher simplification
lib/product-context.ts, components/shell/ProductSwitcher.tsx
Adds products: Product[] to ProductContextValue with [] default; ProductSwitcher drops local state/effect and reads products from useProduct().
Shell: backend-retry, product-id derivation, and AnvayLogo
components/shell/Shell.tsx, app/(app)/layout.tsx
Adds backendError/bootAttempt state, retryBootstrap() helper, and a 5-second auto-retry effect. Non-401 failures show a backend-unavailable screen with manual "Retry now" button. Product-id derivation prefers the /p/:id URL segment. app/(app)/layout.tsx wraps children in Shell. PRODUCT_CHORDS updated: kskills, new msetup-client.
WebVitalsReporter
components/perf/WebVitalsReporter.tsx, app/layout.tsx
New 'use client' component using useReportWebVitals to send Web Vital payloads (route, optional product_id, navigation_type) via CSRF-protected fetch or sendBeacon fallback to /api/anvay/metrics/web-vitals. Mounted in RootLayout before {children}. Removes Shell wrapper from root layout; Shell is wrapped via app/(app)/layout.tsx instead.
SetupClient feature: McpSetupCard, route, and nav wiring
components/screens/McpSetupCard.tsx, components/screens/SetupClient.tsx, app/(app)/p/[product]/setup-client/page.tsx, components/shell/SideNav.tsx, components/shell/CommandPalette.tsx, components/shell/ShortcutsHelp.tsx
Adds McpSetupCard (client selector, copy-prompt workflow for MCP add + verify steps, buildCheckPrompt for healthcheck), SetupClient screen component, and route page. Wires into SideNav, CommandPalette, and ShortcutsHelp with g m keyboard chord.
Skills route consolidation
components/stages/StageShell.tsx, app/(app)/p/[product]/skill/page.tsx, app/(app)/p/[product]/skills/[...id]/page.tsx, app/p/[product]/skills/[...id]/page.tsx, components/screens/IngestStage.tsx, components/screens/ReviewStage.tsx, components/screens/Dashboard.tsx, components/screens/Skills.tsx
Converts /skill and /skills/[...id] pages to redirects. Updates all internal links to /skills. Refactors Skills from a searchable list to a single-master-skill display with SkillPackSummary and SkillDetail, badges for confidence (when available) and total evidence count.
ConnectorDetail sync refactor and ConnectorNew active connectors
components/sources/IngestionProgress.tsx, components/screens/ConnectorDetail.tsx, components/screens/ConnectorNew.tsx
Replaces useEventStream/log-URL streaming in ConnectorDetail with IngestionProgress+IngestStatus pattern. Adds watchingSync/syncRun state; sync button disabled/label reflects starting vs running. IngestionProgress gains optional idleUntilStarted prop and gates EventSource stream. ConnectorNew promotes filesystem and confluence from disabled to active connector options with field pattern validation.
ProjectsDashboard: ag-grid removal and PendingActionsTable
components/screens/ProjectsDashboard.tsx
Removes ag-grid imports/registration/column defs; replaces pending-actions grid with PendingActionsTable (native HTML table with per-row action links) and PendingHeader. ProductCard primary action becomes stage-driven. EmptyState uses AnvayLogo. Skill stageVisual cta updated to "View skills".
GraphRAG path display and ProductAsk AnswerMeta updates
components/screens/ProductAsk.tsx
Graph-path rendering switches from path.summary to seed_name/node_count/edge_count/relationship_types/confidence/truncated source_anchors. AnswerMeta gains graph_relationships_used badge and updated label text.
Docs types, Tina API integration, and markdown utilities
lib/docs/types.ts, lib/docs/tina.ts, lib/docs/markdown.ts
Adds DocPage/DocNavItem/DocNavGroup/DocHeading/DocsResult types. Implements getDocs() via Tina Cloud GraphQL with timeout/revalidation, findDocPage() with legacy alias remapping, docsEditUrl() for edit links. Implements extractHeadings() and slugifyHeading() for Markdown heading extraction and deduplication.
Docs chrome layout, nav, search, and route page
components/docs/DocsChrome.tsx, components/docs/DocsNav.tsx, app/(public)/docs/[[...slug]]/page.tsx
Adds DocsChrome layout with sticky top bar, left DocsNav (grouped items, active slug highlighting), article (group badge/title/description/body), and right "On this page" anchor list. DocsNav implements DocsSearch with Fuse.js fuzzy+exact search, keyboard shortcuts (⌘K/Ctrl+K, /), arrow navigation, Enter to navigate (with optional #sectionId). Route page uses 60s revalidation and getDocs()/findDocPage().
Markdown table/rule/Mermaid rendering and typography
components/ui/markdown.tsx, components/ui/typography.tsx, components/docs/MermaidDiagram.tsx
Extends Markdown renderer to parse/render horizontal rules, tables, and Mermaid code blocks via MermaidDiagram. Adds headingCounts ID deduplication. Updates quote and paragraph typography. H1/H2/H3 accept full React.HTMLAttributes for anchor id support. MermaidDiagram initializes Mermaid once, detects narrow screens and rewrites flowchart LRTB, renders SVG with error handling.
TinaCMS config and docs validation script
tina/config.ts, scripts/seed-tina-docs.mjs
Adds TinaCMS config with runtime branch selection, Docs MDX collection schema, and UI router mapping. seed-tina-docs.mjs validates curated MDX: required frontmatter, kebab-case slug uniqueness, rejects raw HTML tags in body.
Documentation updates: README, DESIGN, AGENTS
README.md, DESIGN.md, AGENTS.md
README updated with Anvay branding, backend prerequisite, Tina Cloud env vars, route table, and Performance checks section. DESIGN.md adds /setup-client route, g m shortcut, expanded connector-scope (GitHub, filesystem, Jira, Confluence). AGENTS.md updates ../nexus links to ../anvay.
Landing page and global CSS rebrand to Anvay
app/globals.css, components/screens/LandingPage.tsx
Renames all nexus-* CSS classes to anvay-* (theme tokens, keyframes, auth shell, all landing sections, nav, hero, product-frame, sidebar, cards, badges, trace rows, delivery grid, responsive breakpoints). LandingPage.tsx updates class names, hero/tab/CTA copy, and restructures "Delivery" section.
Branding rename: logo, metadata, animations, and copy
components/icons/AnvayLogo.tsx, components/shell/TopBar.tsx, components/screens/LoginScreen.tsx, components/screens/RequestAccessScreen.tsx, app/(app)/..., app/(public)/..., app/error.tsx, components/screens/Setup.tsx, components/ui/..., components/screens/Council*.tsx, components/screens/NewProduct.tsx
Renames NexusLogo to AnvayLogo with updated assets. Updates all page metadata.title strings to Anvay. Swaps nexus-* animation classes to anvay-*. Adds Docs footer links to LoginScreen and RequestAccessScreen. Updates Setup.tsx repo defaults and env var references. Adjusts badge/card opacity values.
Performance tooling: bundle budgets, Lighthouse CI, and build optimization
scripts/check-route-budgets.mjs, lighthouserc.js, next.config.ts, package.json, .github/workflows/ci.yml, PERFORMANCE.md, .fallowrc.json, .env.example, .gitignore
Adds check-route-budgets.mjs (enforces hard/target KB caps per route, exits 1 on breach). Adds lighthouserc.js (LCP/CLS/TBT assertions). Enables optimizePackageImports in next.config.ts. CI gains "Route bundle budgets" step with ANVAY_API_URL env. package.json adds perf:* and cms:* scripts; removes ag-grid; adds fuse.js, mermaid, @lhci/cli. Adds PERFORMANCE.md, .env.example, .fallowrc.json, and .gitignore updates.
Public layout and environment configuration
app/(public)/layout.tsx, .env.example, content/docs/.gitkeep
Adds PublicLayout wrapping children with Anvay theme classes. Adds .env.example with ANVAY_API_URL and Tina Cloud variables. Adds content/docs/.gitkeep to initialize the docs directory.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

  • 0xaeres/anvay-ui#2: Both PRs update components/shell/Shell.tsx and PRODUCT_CHORDS keyboard navigation mappings, and the current PR's shell backend-retry and product-id logic is a continuation of the retrieved PR's shell initialization and public auth route gating work.

Poem

🐇 Hop, hop — the name is new today,
Anvay replaces what once was "Nex,"
The shell retries when backends stray,
MCP prompts copy at your behex.
Tina docs spring forth with search so sweet,
And bundle budgets keep the bytes neat!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 1.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main changes: rebranding to Anvay and adding docs plus MCP setup, matching the changeset's primary objectives.
Description check ✅ Passed The description is directly related to the changeset, providing a structured summary of the rebranding, new features (MCP setup, docs, performance tooling), and validation details.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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


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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 9

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
components/shell/Shell.tsx (1)

257-265: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Memoize ProductContext.Provider value to prevent broad consumer rerenders.

This value object is rebuilt each render, so unrelated state changes (palette/help toggles) can redraw every context consumer.

Proposed refactor
-import { useState, useEffect, useRef } from 'react'
+import { useState, useEffect, useRef, useMemo } from 'react'
@@
+  const productContextValue = useMemo(
+    () => ({
+      currentProductId,
+      currentProduct,
+      products,
+      currentUser: baseUser,
+      perms,
+      memberships,
+      loading,
+    }),
+    [currentProductId, currentProduct, products, baseUser, perms, memberships, loading],
+  )
+
   return (
     <TooltipProvider delayDuration={250}>
-      <ProductContext.Provider value={{
-        currentProductId,
-        currentProduct,
-        products,
-        currentUser: baseUser,
-        perms,
-        memberships,
-        loading,
-      }}>
+      <ProductContext.Provider value={productContextValue}>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/shell/Shell.tsx` around lines 257 - 265, The value object passed
to the ProductContext.Provider is being recreated on every render, causing
unnecessary rerenders of all context consumers when unrelated state changes
occur. Wrap the ProductContext.Provider value object (containing
currentProductId, currentProduct, products, currentUser, perms, memberships, and
loading) with the useMemo hook, ensuring the dependencies array includes all
these values so the memoized object is only recreated when one of these props
actually changes.

Source: Linters/SAST tools

🤖 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 @.github/workflows/ci.yml:
- Around line 45-48: The Lighthouse CI job has an unreachable backend URL
configured via the ANVAY_API_URL environment variable (set to
http://127.0.0.1:65535), which causes proxy calls to fail and results in
auditing error states instead of real product route content. Fix this by either
providing a valid, reachable backend URL for the ANVAY_API_URL environment
variable in the Lighthouse CI step, or modify the lighthouserc.js configuration
to exclude the product routes (/p/anvay/dashboard and /p/anvay/setup-client)
from the audit URLs until proper authenticated backend fixtures are available
for CI.

In `@app/globals.css`:
- Around line 3-5: The `@source` directives in the globals.css file contain
absolute filesystem paths that are machine-specific and will cause issues for
other developers and in CI/deployment environments. Remove the three `@source`
directives entirely, or replace the absolute paths (starting with
/Users/aeres/Desktop/projects/anvay-ui/) with relative paths from the project
root using format like `@source` "../components/**/*.tsx". Since Tailwind v4 has
automatic content detection, removing the explicit `@source` directives altogether
is the simplest solution and will allow Tailwind to auto-detect the template
files.

In `@app/p/`[product]/skills/[...id]/page.tsx:
- Around line 1-10: The SkillDetailRoute component currently discards the id
parameter from params and redirects to the skills list, breaking navigation
links from SkillStage.tsx and ReviewStage.tsx. Instead of using the redirect
function, destructure both product and id from the awaited params object in
SkillDetailRoute, then render the SkillDetailPage component passing both the
product and id parameters to it. This will make the skill detail routes
accessible and allow users to navigate to individual skill pages as intended.

In `@components/screens/McpSetupCard.tsx`:
- Around line 143-146: The copy function does not handle errors that may occur
when navigator.clipboard.writeText rejects, resulting in unhandled promise
rejections and no user feedback on failure. Add error handling to the copy
function by wrapping the clipboard write operation in a try-catch block, and
when an error is caught, display a toast notification with an error variant to
inform the user that the copy operation failed. This ensures the user receives
feedback whether the clipboard write succeeds or fails.
- Line 235: Replace the inline `text-xs` utility class in the marker span
element (the span with className containing border-accent/40 bg-accent/10) with
an appropriate typography primitive component like `Small` or `Code` to conform
to the fixed typography scale defined in the coding guidelines. Remove `text-xs`
from the className string and wrap the text content with the selected typography
component instead.

In `@components/screens/ProjectsDashboard.tsx`:
- Line 779: The table header element uses a raw `text-xs` typography class
inline instead of leveraging the typography scale primitives. Replace the
`text-xs` class in the `<th>` element with the `Small` typography scale
primitive to maintain consistency with the design system's fixed typography
scale. Keep the `<th>` element for layout purposes and apply the `Small`
primitive to handle the text styling instead of using inline size classes.

In `@components/screens/ReviewStage.tsx`:
- Line 529: The CSS class rename from Nexus to Anvay (anvay-scrollbar-visible)
in the className attribute of the div element is branding work that should be
organized in the branding layers (10 or 11), not mixed into the Skills
consolidation layer. Move this CSS class usage to the appropriate branding layer
where other Nexus→Anvay rebrand work is consolidated, and replace it with a
layer-appropriate class reference or remove it from this Skills consolidation
component if the styling should be handled elsewhere.

In `@components/shell/Shell.tsx`:
- Line 101: The setBackendError calls are passing raw error messages from the
backend that may contain sensitive information like URLs or request body
content. Replace the direct e.message values with generic, user-friendly error
messages (like "An error occurred" or similar) for display in the UI. Keep the
raw error details separate and use them only for logging or telemetry purposes.
Apply this change to both the setBackendError call at line 101 and the
additional occurrences mentioned at lines 240-243.

In `@DESIGN.md`:
- Around line 81-84: Update the route documentation in DESIGN.md to accurately
reflect the catch-all route pattern. The line listing /skills/[id] should be
changed to /skills/[...id] to match the actual file structure at
app/p/[product]/skills/[...id]/page.tsx, which implements a catch-all redirect
route rather than a single parameter segment route.

---

Outside diff comments:
In `@components/shell/Shell.tsx`:
- Around line 257-265: The value object passed to the ProductContext.Provider is
being recreated on every render, causing unnecessary rerenders of all context
consumers when unrelated state changes occur. Wrap the ProductContext.Provider
value object (containing currentProductId, currentProduct, products,
currentUser, perms, memberships, and loading) with the useMemo hook, ensuring
the dependencies array includes all these values so the memoized object is only
recreated when one of these props actually changes.
🪄 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: ae8b9b02-61c3-4713-8cdf-14197deaa075

📥 Commits

Reviewing files that changed from the base of the PR and between cd675d1 and e2f567a.

⛔ Files ignored due to path filters (14)
  • app/icon.svg is excluded by !**/*.svg
  • package-lock.json is excluded by !**/package-lock.json
  • public/anvay-app-icon-v2.svg is excluded by !**/*.svg
  • public/anvay-logo-v2-light.svg is excluded by !**/*.svg
  • public/anvay-logo-v2.svg is excluded by !**/*.svg
  • public/anvay-logo.svg is excluded by !**/*.svg
  • public/anvay-symbol-v2.svg is excluded by !**/*.svg
  • public/anvay-wordmark.svg is excluded by !**/*.svg
  • public/nexus-app-icon-v2.svg is excluded by !**/*.svg
  • public/nexus-logo-v2-light.svg is excluded by !**/*.svg
  • public/nexus-logo-v2.svg is excluded by !**/*.svg
  • public/nexus-logo.svg is excluded by !**/*.svg
  • public/nexus-symbol-v2.svg is excluded by !**/*.svg
  • public/nexus-wordmark.svg is excluded by !**/*.svg
📒 Files selected for processing (57)
  • .fallowrc.json
  • .github/workflows/ci.yml
  • AGENTS.md
  • DESIGN.md
  • PERFORMANCE.md
  • README.md
  • app/admin/access/page.tsx
  • app/api/anvay/[...path]/route.ts
  • app/error.tsx
  • app/globals.css
  • app/landing/page.tsx
  • app/layout.tsx
  • app/login/page.tsx
  • app/new/page.tsx
  • app/p/[product]/layout.tsx
  • app/p/[product]/setup-client/page.tsx
  • app/p/[product]/skill/page.tsx
  • app/p/[product]/skills/[...id]/page.tsx
  • app/request-access/page.tsx
  • app/setup/page.tsx
  • components/icons/AnvayLogo.tsx
  • components/perf/WebVitalsReporter.tsx
  • components/screens/ConnectorDetail.tsx
  • components/screens/ConnectorNew.tsx
  • components/screens/CouncilSession.tsx
  • components/screens/CouncilStage.tsx
  • components/screens/Dashboard.tsx
  • components/screens/IngestStage.tsx
  • components/screens/LandingPage.tsx
  • components/screens/LoginScreen.tsx
  • components/screens/McpSetupCard.tsx
  • components/screens/NewProduct.tsx
  • components/screens/ProductAsk.tsx
  • components/screens/ProjectsDashboard.tsx
  • components/screens/ReviewStage.tsx
  • components/screens/Setup.tsx
  • components/screens/SetupClient.tsx
  • components/screens/Skills.tsx
  • components/shell/CommandPalette.tsx
  • components/shell/ProductSwitcher.tsx
  • components/shell/Shell.tsx
  • components/shell/ShortcutsHelp.tsx
  • components/shell/SideNav.tsx
  • components/shell/TopBar.tsx
  • components/sources/IngestionProgress.tsx
  • components/stages/StageShell.tsx
  • components/ui/badge.tsx
  • components/ui/card.tsx
  • components/ui/skeleton.tsx
  • components/ui/status-dot.tsx
  • lib/api/client.ts
  • lib/product-context.ts
  • lib/types.ts
  • lighthouserc.js
  • next.config.ts
  • package.json
  • scripts/check-route-budgets.mjs

Comment thread .github/workflows/ci.yml
Comment thread app/globals.css Outdated
Comment thread app/(app)/p/[product]/skills/[...id]/page.tsx Outdated
Comment thread components/screens/McpSetupCard.tsx
Comment thread components/screens/McpSetupCard.tsx Outdated
Comment thread components/screens/ProjectsDashboard.tsx
Comment thread components/screens/ReviewStage.tsx
Comment thread components/shell/Shell.tsx Outdated
Comment thread DESIGN.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
lighthouserc.js (1)

4-12: 🩺 Stability & Availability | 🟠 Major

Ensure Lighthouse CI can reach the backend, not just the frontend.

startServerCommand only starts the Next.js server, but ANVAY_API_URL is set to http://127.0.0.1:65535 in CI. The app requires the Anvay backend at http://localhost:8000 per README.md. With the API unreachable, these URLs will benchmark pages in a fallback or error state, making the Lighthouse scores and route budgets invalid. Either start the FastAPI backend in the CI pipeline alongside the frontend, or correct the API URL.

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

In `@lighthouserc.js` around lines 4 - 12, The startServerCommand in the
Lighthouse configuration only starts the Next.js frontend server, but the
application requires the Anvay backend API running at http://localhost:8000 as
documented in the README. Modify the startServerCommand to also start the
FastAPI backend server alongside the frontend server on port 8000, or ensure the
ANVAY_API_URL environment variable is properly configured to reach the backend.
Without the backend running, the urls being tested will execute in a fallback or
error state, making the Lighthouse scores and route budgets invalid for
benchmarking purposes.
🤖 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.

Outside diff comments:
In `@lighthouserc.js`:
- Around line 4-12: The startServerCommand in the Lighthouse configuration only
starts the Next.js frontend server, but the application requires the Anvay
backend API running at http://localhost:8000 as documented in the README. Modify
the startServerCommand to also start the FastAPI backend server alongside the
frontend server on port 8000, or ensure the ANVAY_API_URL environment variable
is properly configured to reach the backend. Without the backend running, the
urls being tested will execute in a fallback or error state, making the
Lighthouse scores and route budgets invalid for benchmarking purposes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: eccb0b3b-eadb-4c59-8439-45ceafe338f2

📥 Commits

Reviewing files that changed from the base of the PR and between e2f567a and 6ca86bb.

📒 Files selected for processing (1)
  • lighthouserc.js

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
components/shell/Shell.tsx (1)

65-67: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Separate redirecting/unauthenticated UI from backend outage UI.

Line 217 uses backendError || !user, so normal redirect flows (Lines 65-67 and 88-90) can briefly show a false “backend unavailable” screen.

Proposed fix
-  if (backendError || !user) {
+  if (backendError) {
     return (
       <div className="grid h-screen place-items-center bg-bg px-6 text-fg">
         <div className="flex max-w-md flex-col items-center gap-5 text-center">
@@
       </div>
     )
   }
+
+  if (!user) {
+    return (
+      <div className="grid h-screen place-items-center bg-bg text-fg">
+        <div className="flex flex-col items-center gap-4">
+          <AnvayLogo markOnly priority size="md" className="animate-pulse-slow" />
+          <span className="font-mono text-xs text-fg-subtle">redirecting</span>
+        </div>
+      </div>
+    )
+  }

Also applies to: 88-90, 217-217

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

In `@components/shell/Shell.tsx` around lines 65 - 67, The condition on line 217
that checks `backendError || !user` causes redirect flows (in lines 65-67 and
88-90) to briefly display a false "backend unavailable" message. To fix this,
separate the logic by adding an additional state or flag to track whether a
redirect is in progress. Check this redirect flag before displaying the backend
error UI, ensuring that normal redirect flows and authentication checks execute
without triggering the backend unavailable screen. This way, the backend outage
UI only displays when there is an actual backend error and not during normal
authentication or redirect operations.
🤖 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 @.env.example:
- Around line 1-8: The environment variables in the .env.example file are not
ordered alphabetically, which is causing dotenv-linter to flag them. Reorder the
five environment variable declarations (ANVAY_API_URL,
NEXT_PUBLIC_TINA_CLIENT_ID, TINA_TOKEN, TINA_BRANCH, and
NEXT_PUBLIC_TINA_ADMIN_URL) so they appear in strict alphabetical order:
ANVAY_API_URL, NEXT_PUBLIC_TINA_ADMIN_URL, NEXT_PUBLIC_TINA_CLIENT_ID,
TINA_BRANCH, then TINA_TOKEN.

In `@components/docs/DocsNav.tsx`:
- Around line 207-223: The combined Map is currently keyed only by slug, causing
multiple section matches within the same document to overwrite each other.
Instead of using just entry.slug as the key, modify the key structure to be
unique per section within a document (for example, combining slug with section
information). This requires updating both the combined.set() calls in the exact
match loop and the fuzzy match loop, as well as the deduplication check that
uses combined.has(result.item.slug), so that entries from different sections are
preserved rather than dropped.

In `@components/screens/ConnectorNew.tsx`:
- Around line 37-45: The filesystem connector's `root` field lacks frontend
validation to ensure users provide an absolute path, which impacts user
experience by delaying error detection to the backend. Add a `pattern` property
to the `root` field object that validates the input matches an absolute path
pattern (e.g., paths starting with `/` for Unix or Windows drive letters like
`C:\`). You may need to verify that the Input rendering logic at lines 220-227
supports the pattern property, or alternatively add custom validation logic in
the `handleSubmit` function to check the root field before submission.

In `@components/screens/LandingPage.tsx`:
- Around line 45-47: The LandingPage.tsx file uses non-semantic div elements
with role="heading" and aria-level attributes instead of native HTML heading
elements, which reduces accessibility. Replace all instances of `<div
role="heading" aria-level={...}>` with semantic heading elements: change
aria-level={1} to `<h1>`, aria-level={2} to `<h2>`, and aria-level={3} to
`<h3>`. Remove the role="heading" and aria-level attributes since the semantic
elements provide that meaning. Apply this change to all six instances found in
the file: the one shown in the diff plus the four additional instances on lines
64-66, 89-91, 143-145, and 157-159, as well as the one on line 134-135.

In `@components/ui/markdown.tsx`:
- Around line 59-63: The regex pattern in the markdown table separator row
validation (the pattern matching
`/^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?\s*$/`) requires at least two
columns due to the `+` quantifier on the grouped pattern `(\|\s*:?-{3,}:?\s*)+`.
To allow single-column markdown tables, change the quantifier from `+` to `*` in
that grouped pattern so it matches zero or more additional columns instead of
one or more, thereby permitting tables with just one separator cell.
- Around line 317-325: The heading ID deduplication logic in the markdown
rendering block increments headingCounts for all heading depths, but the
extractHeadings() function only indexes headings with specific depths (for the
table of contents). This mismatch causes ID shifts and breaks anchor links.
Modify the deduplication logic to only increment headingCounts for the same
heading depths that extractHeadings() processes, ensuring the ID generation
aligns with what appears in the right-rail TOC.

In `@lib/docs/tina.ts`:
- Around line 131-140: The fetch call for the Tina Cloud request in the tina.ts
file has no timeout mechanism, which means a stalled connection can hang
indefinitely and block the `/docs` rendering. Add an AbortController with a
timeout to the fetch request by creating an AbortController instance, setting a
timeout using setTimeout that calls abort() on the controller, and then passing
the abort signal in the fetch options. Make sure the timeout duration is
reasonable (e.g., a few seconds) to prevent the request from hanging.

In `@proxy.ts`:
- Around line 8-24: The hasValidSession function treats all error cases
identically, returning false for both invalid sessions and backend
unavailability, causing valid sessions to redirect to /landing during transient
failures. Modify the function to distinguish between "definitely invalid
session" (401/403 responses) which should return false, and "backend temporarily
unreachable" (other error responses or exceptions) which should return true to
allow access. Specifically, check the response status code before the
response.ok check - return false only for 401 or 403 status codes, return true
for successful responses (2xx), and change the catch block to return true
instead of false to gracefully handle network errors and timeout exceptions.

In `@scripts/seed-tina-docs.mjs`:
- Line 21: The frontmatter regex pattern in the frontmatter constant uses only
`\n` for line endings, which fails to match valid MDX files that use
Windows-style CRLF line endings. Update the regex pattern to handle both Unix
(`\n`) and Windows (`\r\n`) line endings by replacing occurrences of `\n` with a
pattern that matches an optional carriage return followed by a newline (e.g.,
`\r?\n`). This will ensure the frontmatter parsing works correctly regardless of
the file's line ending style.
- Around line 30-33: The slug validation in the frontmatter parsing section only
checks for non-empty and uniqueness but does not validate the actual format of
the slug value. Add format validation after the slug extraction and trim
operation to ensure it matches a valid URL-safe pattern (lowercase alphanumeric
characters and hyphens only, no spaces, uppercase letters, or special
punctuation). This validation should happen after the initial non-empty check
but can be combined with the existing error handling, ensuring that only
properly formatted slugs that are safe for use in `/docs/${slug}` route
contracts are accepted.

---

Outside diff comments:
In `@components/shell/Shell.tsx`:
- Around line 65-67: The condition on line 217 that checks `backendError ||
!user` causes redirect flows (in lines 65-67 and 88-90) to briefly display a
false "backend unavailable" message. To fix this, separate the logic by adding
an additional state or flag to track whether a redirect is in progress. Check
this redirect flag before displaying the backend error UI, ensuring that normal
redirect flows and authentication checks execute without triggering the backend
unavailable screen. This way, the backend outage UI only displays when there is
an actual backend error and not during normal authentication or redirect
operations.
🪄 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: ef927148-ca03-4440-8c53-46b1a14c78ee

📥 Commits

Reviewing files that changed from the base of the PR and between 6ca86bb and 887bb45.

⛔ Files ignored due to path filters (11)
  • package-lock.json is excluded by !**/package-lock.json
  • tina/__generated__/_graphql.json is excluded by !**/__generated__/**
  • tina/__generated__/_lookup.json is excluded by !**/__generated__/**
  • tina/__generated__/_schema.json is excluded by !**/__generated__/**
  • tina/__generated__/client.ts is excluded by !**/__generated__/**
  • tina/__generated__/config.prebuild.jsx is excluded by !**/__generated__/**
  • tina/__generated__/frags.gql is excluded by !**/__generated__/**
  • tina/__generated__/queries.gql is excluded by !**/__generated__/**
  • tina/__generated__/schema.gql is excluded by !**/__generated__/**
  • tina/__generated__/types.js is excluded by !**/__generated__/**
  • tina/__generated__/types.ts is excluded by !**/__generated__/**
📒 Files selected for processing (55)
  • .env.example
  • .fallowrc.json
  • .gitignore
  • AGENTS.md
  • DESIGN.md
  • README.md
  • app/(app)/admin/access/page.tsx
  • app/(app)/layout.tsx
  • app/(app)/new/page.tsx
  • app/(app)/p/[product]/ask/page.tsx
  • app/(app)/p/[product]/council/[sessionId]/page.tsx
  • app/(app)/p/[product]/council/page.tsx
  • app/(app)/p/[product]/dashboard/loading.tsx
  • app/(app)/p/[product]/dashboard/page.tsx
  • app/(app)/p/[product]/ingest/page.tsx
  • app/(app)/p/[product]/layout.tsx
  • app/(app)/p/[product]/loading.tsx
  • app/(app)/p/[product]/not-found.tsx
  • app/(app)/p/[product]/page.tsx
  • app/(app)/p/[product]/review/page.tsx
  • app/(app)/p/[product]/setup-client/page.tsx
  • app/(app)/p/[product]/skill/page.tsx
  • app/(app)/p/[product]/skills/[...id]/page.tsx
  • app/(app)/p/[product]/skills/loading.tsx
  • app/(app)/p/[product]/skills/page.tsx
  • app/(app)/p/[product]/sources/[name]/page.tsx
  • app/(app)/p/[product]/sources/loading.tsx
  • app/(app)/p/[product]/sources/new/page.tsx
  • app/(app)/p/[product]/sources/page.tsx
  • app/(app)/page.tsx
  • app/(app)/setup/page.tsx
  • app/(public)/docs/[[...slug]]/page.tsx
  • app/(public)/landing/page.tsx
  • app/(public)/layout.tsx
  • app/(public)/login/page.tsx
  • app/(public)/request-access/page.tsx
  • app/layout.tsx
  • components/docs/DocsChrome.tsx
  • components/docs/DocsNav.tsx
  • components/docs/MermaidDiagram.tsx
  • components/screens/ConnectorNew.tsx
  • components/screens/LandingPage.tsx
  • components/screens/LoginScreen.tsx
  • components/screens/RequestAccessScreen.tsx
  • components/shell/Shell.tsx
  • components/ui/markdown.tsx
  • components/ui/typography.tsx
  • content/docs/.gitkeep
  • lib/docs/markdown.ts
  • lib/docs/tina.ts
  • lib/docs/types.ts
  • package.json
  • proxy.ts
  • scripts/seed-tina-docs.mjs
  • tina/config.ts
💤 Files with no reviewable changes (9)
  • app/(app)/new/page.tsx
  • app/(public)/request-access/page.tsx
  • app/(app)/p/[product]/skills/[...id]/page.tsx
  • app/(app)/p/[product]/skill/page.tsx
  • app/(app)/admin/access/page.tsx
  • app/(app)/setup/page.tsx
  • app/(app)/p/[product]/layout.tsx
  • app/(public)/login/page.tsx
  • app/(app)/p/[product]/setup-client/page.tsx

Comment thread .env.example Outdated
Comment thread components/docs/DocsNav.tsx
Comment thread components/screens/ConnectorNew.tsx
Comment thread components/screens/LandingPage.tsx Outdated
Comment thread components/ui/markdown.tsx
Comment thread components/ui/markdown.tsx
Comment thread lib/docs/tina.ts Outdated
Comment thread proxy.ts
Comment thread scripts/seed-tina-docs.mjs Outdated
Comment thread scripts/seed-tina-docs.mjs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
components/docs/DocsNav.tsx (1)

237-323: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Wire up combobox ARIA so assistive tech tracks the active result.

The input owns a role="listbox" popup and arrow-key navigation updates activeResult visually, but the input isn't announced as a combobox and the active option isn't exposed. Screen-reader users get no feedback on which result is highlighted. Add combobox semantics and aria-activedescendant pointing at the active option's id.

♿ Suggested ARIA wiring
         <input
           ref={searchRef}
           value={query}
+          role="combobox"
+          aria-expanded={query.length > 0 && results.length > 0}
+          aria-controls="docs-search-listbox"
+          aria-activedescendant={results.length ? `docs-search-opt-${activeResult}` : undefined}
           onChange={(event) => setQuery(event.target.value)}
           <div
+            id="docs-search-listbox"
             className="absolute left-0 right-0 top-12 z-40 ..."
             role="listbox"
             aria-label="Documentation search results"
           >
                 <button
                   key={`${result.slug}-${result.sectionId}-${index}`}
+                  id={`docs-search-opt-${index}`}
                   type="button"
                   role="option"
                   aria-selected={index === activeResult}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/docs/DocsNav.tsx` around lines 237 - 323, The input element needs
combobox ARIA semantics to properly expose the active result to screen readers.
Add role="combobox" and aria-expanded attribute to the input element, then add
unique id attributes to each result button in the results.map() function using
the same pattern as the existing key prop. Finally, add aria-activedescendant to
the input element that dynamically points to the id of the currently active
result button based on the activeResult state variable, ensuring screen reader
users receive feedback about which search result is highlighted.
♻️ Duplicate comments (1)
components/docs/DocsNav.tsx (1)

203-224: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Search deduplication still drops valid section matches.

combined remains keyed by result.slug/result.item.slug, so multiple matching sections within the same doc overwrite each other and Enter-navigation can target the wrong section. Key by slug + sectionId instead.

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

In `@components/docs/DocsNav.tsx` around lines 203 - 224, The combined Map in the
search deduplication logic currently uses only the slug as its key, causing
multiple matching sections within the same document to overwrite each other.
Update the Map key to include both the slug and sectionId to uniquely identify
each section. This requires changing the key in the combined.set() calls for
both the exact match loop (using entry.slug) and the fuzzy match loop (using
result.item.slug), as well as updating the combined.has() check in the fuzzy
match loop to account for the composite key format. Ensure the sectionId is
properly extracted from the entry and result.item objects.
🤖 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.

Outside diff comments:
In `@components/docs/DocsNav.tsx`:
- Around line 237-323: The input element needs combobox ARIA semantics to
properly expose the active result to screen readers. Add role="combobox" and
aria-expanded attribute to the input element, then add unique id attributes to
each result button in the results.map() function using the same pattern as the
existing key prop. Finally, add aria-activedescendant to the input element that
dynamically points to the id of the currently active result button based on the
activeResult state variable, ensuring screen reader users receive feedback about
which search result is highlighted.

---

Duplicate comments:
In `@components/docs/DocsNav.tsx`:
- Around line 203-224: The combined Map in the search deduplication logic
currently uses only the slug as its key, causing multiple matching sections
within the same document to overwrite each other. Update the Map key to include
both the slug and sectionId to uniquely identify each section. This requires
changing the key in the combined.set() calls for both the exact match loop
(using entry.slug) and the fuzzy match loop (using result.item.slug), as well as
updating the combined.has() check in the fuzzy match loop to account for the
composite key format. Ensure the sectionId is properly extracted from the entry
and result.item objects.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9c9f5542-c1c1-4b9e-9be8-12c7e9c1f2de

📥 Commits

Reviewing files that changed from the base of the PR and between 887bb45 and e046b9c.

📒 Files selected for processing (2)
  • components/docs/DocsChrome.tsx
  • components/docs/DocsNav.tsx

@0xaeres 0xaeres changed the title Feature/UI enhancement Rebrand to Anvay and add docs plus MCP setup Jun 24, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
components/screens/LandingPage.tsx (1)

95-111: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Complete ARIA tab wiring for the tablist.

With role="tab"/role="tabpanel" on Line 95-111, add explicit control relationships (id, aria-controls, aria-labelledby) and roving tabIndex; otherwise screen-reader tab semantics are incomplete.

Suggested patch
             <div className="anvay-landing-tabs" role="tablist" aria-label="Workflow preview">
               {(Object.keys(TABS) as TabId[]).map((tabId) => (
                 <button
                   key={tabId}
+                  id={`workflow-tab-${tabId}`}
                   className="anvay-landing-tab"
                   type="button"
                   role="tab"
+                  tabIndex={tab === tabId ? 0 : -1}
+                  aria-controls="workflow-tabpanel"
                   aria-selected={tab === tabId}
                   onClick={() => setTab(tabId)}
                 >
                   {tabId[0].toUpperCase() + tabId.slice(1)}
                 </button>
               ))}
             </div>
-            <div className="anvay-landing-tab-panel" role="tabpanel">
+            <div
+              id="workflow-tabpanel"
+              className="anvay-landing-tab-panel"
+              role="tabpanel"
+              aria-labelledby={`workflow-tab-${tab}`}
+            >
               {TABS[tab]}
             </div>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/screens/LandingPage.tsx` around lines 95 - 111, The tab
implementation is missing explicit ARIA control relationships required for
proper screen-reader semantics. Add a unique id attribute to the tabpanel div
(the one with role="tabpanel"), then in each tab button (role="tab"), add an
aria-controls attribute pointing to that tabpanel id, and add aria-labelledby
attribute to the tabpanel pointing to the currently active tab button's id.
Additionally, implement roving tabIndex on the tab buttons by setting
tabIndex={tab === tabId ? 0 : -1} on each button to ensure only the active tab
is in the keyboard tab order while other tabs remain focusable but accessible
via arrow keys.
components/ui/markdown.tsx (1)

39-44: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Rule/table detection is bypassed by paragraph accumulation.

On Line 39 and Line 59 you added rule/table parsing, but those branches are skipped when a paragraph starts earlier because the paragraph loop never stops on rule/table starts. That causes valid content to render as plain paragraph text.

Suggested minimal fix
     while (
       i < lines.length &&
       lines[i].trim() &&
+      !/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(lines[i]) &&
+      !(
+        lines[i].includes('|') &&
+        i + 1 < lines.length &&
+        /^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)*\|?\s*$/.test(lines[i + 1])
+      ) &&
       !/^```/.test(lines[i]) &&
       !/^(#{1,6})\s+/.test(lines[i]) &&
       !/^\s*>\s?/.test(lines[i]) &&
       !/^\s*[-*]\s+/.test(lines[i]) &&
       !/^\s*\d+\.\s+/.test(lines[i])

Also applies to: 59-63

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

In `@components/ui/markdown.tsx` around lines 39 - 44, The paragraph accumulation
loop is consuming lines that should be parsed as rules or tables because it
doesn't check for these patterns before adding lines to the current paragraph
block. Fix the paragraph parsing condition to exclude lines that match rule
patterns (horizontal lines matching /^\s*(-{3,}|\*{3,}|_{3,})\s*$/), table
patterns (lines starting with |), headings, block quotes, and list markers. Add
these pattern checks to the while condition that determines whether to continue
accumulating lines into the current paragraph block, so that when a rule or
table line is encountered, the paragraph block ends and the rule/table parsing
logic can properly handle the line instead.
🤖 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 `@components/shell/Shell.tsx`:
- Around line 81-85: The `redirecting` state is never reset when the user is
redirected to the `/setup` route within the same Shell component, causing the
gate at line 213 that checks `if (loading || redirecting)` to perpetually block
rendering of children. Add a useEffect hook that monitors the `pathname`
dependency and automatically calls `setRedirecting(false)` when the pathname
changes to `/setup`. This ensures the `redirecting` state is cleared once the
client-side navigation completes and the children can render normally.

---

Outside diff comments:
In `@components/screens/LandingPage.tsx`:
- Around line 95-111: The tab implementation is missing explicit ARIA control
relationships required for proper screen-reader semantics. Add a unique id
attribute to the tabpanel div (the one with role="tabpanel"), then in each tab
button (role="tab"), add an aria-controls attribute pointing to that tabpanel
id, and add aria-labelledby attribute to the tabpanel pointing to the currently
active tab button's id. Additionally, implement roving tabIndex on the tab
buttons by setting tabIndex={tab === tabId ? 0 : -1} on each button to ensure
only the active tab is in the keyboard tab order while other tabs remain
focusable but accessible via arrow keys.

In `@components/ui/markdown.tsx`:
- Around line 39-44: The paragraph accumulation loop is consuming lines that
should be parsed as rules or tables because it doesn't check for these patterns
before adding lines to the current paragraph block. Fix the paragraph parsing
condition to exclude lines that match rule patterns (horizontal lines matching
/^\s*(-{3,}|\*{3,}|_{3,})\s*$/), table patterns (lines starting with |),
headings, block quotes, and list markers. Add these pattern checks to the while
condition that determines whether to continue accumulating lines into the
current paragraph block, so that when a rule or table line is encountered, the
paragraph block ends and the rule/table parsing logic can properly handle the
line instead.
🪄 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6aea13fe-6334-48a8-a3d6-8ae29cda3dd0

📥 Commits

Reviewing files that changed from the base of the PR and between e046b9c and dfadf56.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (9)
  • .env.example
  • components/docs/DocsNav.tsx
  • components/screens/ConnectorNew.tsx
  • components/screens/LandingPage.tsx
  • components/shell/Shell.tsx
  • components/ui/markdown.tsx
  • lib/docs/tina.ts
  • proxy.ts
  • scripts/seed-tina-docs.mjs

Comment thread components/shell/Shell.tsx
@0xaeres
0xaeres merged commit 1eef63c into main Jun 24, 2026
4 checks passed
@0xaeres
0xaeres deleted the feature/ui-enhancement branch June 24, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant