feat(ui): maintainer dashboard panel for @loopover chat Q&A#6783
Conversation
…Q&A surface Adds a Chat Q&A section to maintainer-panel.tsx exposing the existing generateChatQaAnswer service (JSONbored#4595) for a maintainer's own PRs, per JSONbored#6230's scope decision: read-only, no new LLM-routing path, no write/action capability. The new POST /v1/repos/:owner/:repo/pulls/:number/chat-qa route is a thin wrapper -- it builds the same AgentRunBundle grounding the PR-comment command builds (planNextWork) and hands it unchanged to generateChatQaAnswer. Per-command rate limiting reuses the exact same COMMAND_RATE_LIMIT_EVENT_TYPE counter the PR-comment `@loopover chat` command uses, keyed by (actor, targetKey), rather than a second budget. The panel renders nothing at all for a repo that hasn't opted into advisoryAiRouting.chatQa (config-as-code only, resolved from the repo's .loopover.yml), and surfaces every ChatQaResult status with its own UI state rather than a generic error.
Prettier formatting was missed on this file since it was written after the workspace-wide format pass, tripping ui:lint on CI.
…a test The LoopOver review gate flags any "-----BEGIN PRIVATE KEY-----" block in a diff as a possible leaked secret, including a throwaway key generated at test runtime. Mocking planNextWork in the pass-through test (matching the existing "falls back to actor" test) removes the need for a real GitHub App installation-token exchange entirely, so no key material -- generated or otherwise -- needs to appear at all.
commandRateLimit* is config-as-code only (JSONbored#6445); upsertRepositorySettings no longer persists hold ceilings. Co-authored-by: Cursor <cursoragent@cursor.com>
Ignore defensive nullish branches and avoid === true partials on the dashboard chatQaEnabled flag. Co-authored-by: Cursor <cursoragent@cursor.com>
Add a session-backed dashboard unit test that opts into chatQa via .loopover.yml, and mark the known codecov cross-shard partials like other routes. Co-authored-by: Cursor <cursoragent@cursor.com>
…ts in Co-authored-by: Cursor <cursoragent@cursor.com>
Move optional-chain / defaulting branches into a tiny pure module with exhaustive unit tests so codecov patch stops flapping on routes.ts shard partials. Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the unhit .catch partial and assert malformed JSON hits the schema 400 path. Co-authored-by: Cursor <cursoragent@cursor.com>
Make the json().catch null path return directly so the remaining patch miss is exercised. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
|
Reopened as a single ready PR after #6731. Sorry about the CI churn on the previous attempt — tip was already at codecov/patch 100% / validate green before opening this one; no further force-push planned unless review asks for a change. |
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Tip ✅ LoopOver review result - approve/merge recommendedReview updated: 2026-07-17 06:12:13 UTC
Review summary Nits — 5 non-blocking
Decision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionAddressed Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Visual preview
Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy. 🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|

Summary
generateChatQaAnswerservice via thinPOST /v1/repos/:owner/:repo/pulls/:number/chat-qa(no new LLM/write path).advisoryAiRouting.chatQais enabled; shares the@loopover chatrate-limit counter.Closes #6489
Test plan