Skip to content

feat(auth): persist the GitHub user-to-server token from login - #6125

Merged
JSONbored merged 1 commit into
mainfrom
feat/persist-github-token
Jul 15, 2026
Merged

feat(auth): persist the GitHub user-to-server token from login#6125
JSONbored merged 1 commit into
mainfrom
feat/persist-github-token

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Closes #6114

Summary

  • Foundational piece of the "Unified AMS/ORB Auth" milestone (Persist + expose the GitHub user-to-server token from login instead of discarding it #6114-Security review pass: persisted GitHub token storage, retrieval, and revocation #6117): loopover-mcp login's device-flow/web-OAuth exchange minted a real GitHub user-to-server token, used it exactly once to verify identity (GET /user), then discarded it. AMS's git operations had no way to reuse it and required a separately-configured GITHUB_TOKEN PAT.
  • The token is now persisted encrypted at rest (AES-256-GCM via TOKEN_ENCRYPTION_SECRET, reusing encryptSecret/decryptSecret) in a new isolated table (auth_session_github_tokens) — mirroring repository_ai_keys/repository_linear_keys's existing pattern rather than a column on auth_sessions itself, so the session lookup used on every authenticated request never touches it.
  • New session-scoped POST /v1/auth/github/token endpoint fetches the live token on demand. Session-only (the static mcp/api shared-secret identities are rejected), never cached (Cache-Control: no-store), never bundled into any existing login response.
  • revokeSession now deletes the stored token too, not just the loopover session.
  • Missing TOKEN_ENCRYPTION_SECRET warns and continues rather than blocking login — unlike the BYOK/Linear key stores (which throw), there's no re-mint-on-demand fallback for a user's own OAuth token the way src/orb/broker.ts has for installation tokens, so silently dropping it would leave AMS's later token-fetch failing with no diagnosable trail back to the cause.
  • Caught and fixed a real bug while wiring the OpenAPI spec: isProtectedPath would have documented this new endpoint as public (it special-cased only /v1/auth/extension/session among /v1/auth/* paths as requiring auth).

Test plan

  • New test/unit/auth-github-token.test.ts (16 tests): encrypted round-trip, no-op when no token supplied, warn-not-throw on missing encryption key, null (not throw) on wrong/rotated key, replace-on-reauth (not duplicate), revocation deletes the token, delete-when-absent is a no-op, never appears in the session-creation audit event, end-to-end persistence through both the device-flow and web-OAuth login paths, and the new route's auth gating / 404-when-unavailable / no-store header / telemetry-without-the-token-value.
  • npx vitest run across the new file + auth.test.ts + linear-key.test.ts + openapi.test.ts — all green.
  • Scoped coverage confirms 100% statement/branch coverage on every new/changed line in security.ts, github-oauth.ts, and repositories.ts (verified via the raw v8 coverage JSON directly against the exact new line ranges, since the aggregate file-level percentage understates it for repositories.ts — a ~8000-line file).
  • npm run db:migrations:check / db:schema-drift:check / ui:openapi:check / ui:openapi:settings-parity all pass.
  • Full local npm run test:ci gate green (twice — once pre-rebase, once post-rebase onto fresh origin/main).

Closes #6114

completeGitHubWebOAuth/pollGitHubDeviceFlow fetched a real GitHub
user-to-server token during login, used it once to verify identity via
GET /user, then discarded it -- so a CLI/AMS process had no way to
authenticate git operations without a separately-configured GITHUB_TOKEN
PAT set up outside loopover-mcp login entirely.

Persist the token encrypted at rest (AES-256-GCM, same envelope as the
existing BYOK/Linear key stores) in a new isolated auth_session_github_tokens
table -- kept off the auth_sessions row itself so the session lookup used on
every authenticated request never touches it. Expose it via a new
session-scoped POST /v1/auth/github/token endpoint (never reachable by the
static mcp/api identities, never cached, never bundled into any existing
login response). revokeSession now deletes the stored token too, not just
the loopover session.

Missing TOKEN_ENCRYPTION_SECRET warns and continues rather than blocking
login -- unlike the BYOK/Linear key stores there is no re-mint-on-demand
fallback for a user's own OAuth token, so a silent skip would otherwise be
undiagnosable later when AMS's token fetch comes up empty.
@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@codecov

codecov Bot commented Jul 15, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 1.63kB (0.05%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 3.07MB 1.63kB (0.05%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/tanstack-vendor-v5qYboE4.js (New) 725.54kB 725.54kB 100.0% 🚀
openapi.json 1.1kB 495.64kB 0.22%
assets/maintainer-panel-CFQV4NMY.js (New) 75.5kB 75.5kB 100.0% 🚀
assets/ui-vendor-GBiHp8fk.js (New) 65.83kB 65.83kB 100.0% 🚀
assets/owner-panel-B9xJVDWe.js (New) 58.65kB 58.65kB 100.0% 🚀
assets/docs.self-hosting-configuration-CFNDdQlC.js (New) 48.42kB 48.42kB 100.0% 🚀
assets/app.analytics-Dp5XRw7x.js (New) 36.26kB 36.26kB 100.0% 🚀
assets/docs.self-hosting-release-checklist-BaHHpYmt.js (New) 34.54kB 34.54kB 100.0% 🚀
assets/docs.tuning-B13Qra9d.js (New) 34.42kB 34.42kB 100.0% 🚀
assets/routes-DYQXax8g.js (New) 34.04kB 34.04kB 100.0% 🚀
assets/app.runs-BIkk5ZhI.js (New) 27.11kB 27.11kB 100.0% 🚀
assets/app-CtQj_OC8.js (New) 25.83kB 25.83kB 100.0% 🚀
assets/app.operator-C1qfhirk.js (New) 24.59kB 24.59kB 100.0% 🚀
assets/docs.self-hosting-security-DlbHryHm.js (New) 21.3kB 21.3kB 100.0% 🚀
assets/docs.github-app-9O3g2cwk.js (New) 19.49kB 19.49kB 100.0% 🚀
assets/miner-panel-BXGSF9jN.js (New) 19.23kB 19.23kB 100.0% 🚀
assets/docs.self-hosting-troubleshooting-sPh1T9zu.js (New) 18.47kB 18.47kB 100.0% 🚀
assets/api._op-9R52Rg_2.js (New) 17.89kB 17.89kB 100.0% 🚀
assets/docs.self-hosting-github-app-TmBIepRH.js (New) 17.32kB 17.32kB 100.0% 🚀
assets/docs.how-reviews-work-DtpO97-3.js (New) 17.03kB 17.03kB 100.0% 🚀
assets/app.index-D5FOOYRl.js (New) 16.19kB 16.19kB 100.0% 🚀
assets/docs.maintainer-self-hosting-DKaEJJ1F.js (New) 15.99kB 15.99kB 100.0% 🚀
assets/playground-panel-BBRE0FNp.js (New) 14.43kB 14.43kB 100.0% 🚀
assets/docs.self-hosting-quickstart-xSvStbrP.js (New) 14.15kB 14.15kB 100.0% 🚀
assets/docs.self-hosting-docs-audit-CvMjQ2LT.js (New) 12.14kB 12.14kB 100.0% 🚀
assets/docs.maintainer-install-trust-Ct5E8_5q.js (New) 10.51kB 10.51kB 100.0% 🚀
assets/docs.self-hosting-backup-scaling-DUEoBxmm.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/docs.beta-onboarding-B6qAmg2L.js (New) 9.95kB 9.95kB 100.0% 🚀
assets/app.audit-CowTKP88.js (New) 9.35kB 9.35kB 100.0% 🚀
assets/extension-BkWjqJfD.js (New) 9.21kB 9.21kB 100.0% 🚀
assets/docs.self-hosting-rees-C7reiBmC.js (New) 8.95kB 8.95kB 100.0% 🚀
assets/docs.self-hosting-ai-providers-3emUkWDZ.js (New) 8.92kB 8.92kB 100.0% 🚀
assets/app.config-generator-B2FFkQFk.js (New) 8.13kB 8.13kB 100.0% 🚀
assets/maintainers-DqozhY0L.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-BqvFotoW.js (New) 7.88kB 7.88kB 100.0% 🚀
assets/agents-BDjwwQPS.js (New) 7.76kB 7.76kB 100.0% 🚀
assets/docs.privacy-security-B4b7yuJ9.js (New) 7.21kB 7.21kB 100.0% 🚀
assets/docs.owner-checklist-Db0HzcLI.js (New) 7.0kB 7.0kB 100.0% 🚀
assets/docs.self-hosting-unified-ams-orb-teUabgjL.js (New) 6.84kB 6.84kB 100.0% 🚀
assets/commands-panel-CLodSOAU.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/docs.self-hosting-releases-CqaieiJe.js (New) 6.62kB 6.62kB 100.0% 🚀
assets/roadmap-DenmpHHE.js (New) 6.33kB 6.33kB 100.0% 🚀
assets/docs.self-hosting-rees-analyzers-Cuqtc3mN.js (New) 6.05kB 6.05kB 100.0% 🚀
assets/digest-panel-Bygrxg1t.js (New) 6.04kB 6.04kB 100.0% 🚀
assets/docs.loopover-commands-dM4Zxo5n.js (New) 5.18kB 5.18kB 100.0% 🚀
assets/docs.scoreability-DcYhM8FG.js (New) 5.05kB 5.05kB 100.0% 🚀
assets/docs.troubleshooting-Bt6W0lT4.js (New) 4.91kB 4.91kB 100.0% 🚀
assets/repos._owner._repo.quality-ePZPWSSZ.js (New) 4.87kB 4.87kB 100.0% 🚀
assets/api.index-bkWDyekg.js (New) 4.78kB 4.78kB 100.0% 🚀
assets/docs.index-B5rvwZyV.js (New) 4.74kB 4.74kB 100.0% 🚀
assets/changelog-jqAHOfoY.js (New) 4.67kB 4.67kB 100.0% 🚀
assets/docs.maintainer-workflow-CNdv4AaP.js (New) 4.36kB 4.36kB 100.0% 🚀
assets/docs.self-hosting-rag-DkbBggvI.js (New) 4.35kB 4.35kB 100.0% 🚀
assets/control-primitives-59iAHiQn.js (New) 3.75kB 3.75kB 100.0% 🚀
assets/docs.ai-summaries-BFb_YnoT.js (New) 3.04kB 3.04kB 100.0% 🚀
assets/docs.branch-analysis-D8DQ0C09.js (New) 2.91kB 2.91kB 100.0% 🚀
assets/docs.mcp-clients-DvbzmRyY.js (New) 2.9kB 2.9kB 100.0% 🚀
assets/api-7--B-EDY.js (New) 2.73kB 2.73kB 100.0% 🚀
assets/docs-D3K-Yf47.js (New) 2.67kB 2.67kB 100.0% 🚀
assets/docs.quickstart-Cq3ZEpV4.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/alert-dialog-BsOVvlUt.js (New) 2.07kB 2.07kB 100.0% 🚀
assets/docs.upstream-drift-DPrPGxZh.js (New) 2.04kB 2.04kB 100.0% 🚀
assets/button-9vJMn-sV.js (New) 1.74kB 1.74kB 100.0% 🚀
assets/app.workbench-B9ukRTRm.js (New) 1.63kB 1.63kB 100.0% 🚀
assets/tooltip-Dkk_NwWy.js (New) 1.45kB 1.45kB 100.0% 🚀
assets/session-D2W-8Hte.js (New) 1.44kB 1.44kB 100.0% 🚀
assets/tabs-DkK6lDYh.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/trend-chart-ButCOdUG.js (New) 1.22kB 1.22kB 100.0% 🚀
assets/app.repos-DLeJBbhB.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/switch-DCGerVFV.js (New) 982 bytes 982 bytes 100.0% 🚀
assets/analytics-card-shell-BL0XzSTv.js (New) 972 bytes 972 bytes 100.0% 🚀
assets/use-api-resource-C791yVQY.js (New) 934 bytes 934 bytes 100.0% 🚀
assets/input-CqcM-Nz1.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/refresh-meta-TVmNZn5j.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-BYgCex3O.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-DdX1iptF.js (New) 501 bytes 501 bytes 100.0% 🚀
assets/sparkles-D6yDW2UD.js (New) 494 bytes 494 bytes 100.0% 🚀
assets/app.owner-aI5HKBRJ.js (New) 473 bytes 473 bytes 100.0% 🚀
assets/app.commands-BHDC4SuL.js (New) 454 bytes 454 bytes 100.0% 🚀
assets/reveal-DFKSlxFD.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/app.playground-C0E0hcIR.js (New) 441 bytes 441 bytes 100.0% 🚀
assets/index-9AvEOGQT.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/eye-off-C0IvDl-q.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.digest-BbciP-rO.js (New) 429 bytes 429 bytes 100.0% 🚀
assets/app.miner-BYDVb3Ny.js (New) 421 bytes 421 bytes 100.0% 🚀
assets/key-round-CprAk3h_.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-DFjwN4Az.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-DjweCSyA.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-cFX_nFiv.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-EWTiX5Ro.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/shield-check-BWZ2h728.js (New) 320 bytes 320 bytes 100.0% 🚀
assets/wrench-Wkua9U-m.js (New) 303 bytes 303 bytes 100.0% 🚀
assets/bell-Dg1E6GPu.js (New) 290 bytes 290 bytes 100.0% 🚀
assets/list-checks-CsJBHf7x.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/shield-BYVGHNTd.js (New) 272 bytes 272 bytes 100.0% 🚀
assets/workflow-C8TrSAKP.js (New) 265 bytes 265 bytes 100.0% 🚀
assets/chart-column-CQ6wRYP6.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/compass-CnUA-9Ee.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/skeleton-DlSIPfBF.js (New) 241 bytes 241 bytes 100.0% 🚀
assets/history-sXsaQZcH.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/activity-BhMU0Jqx.js (New) 234 bytes 234 bytes 100.0% 🚀
assets/message-square-mF9IfghV.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/download-5R4rL2BV.js (New) 232 bytes 232 bytes 100.0% 🚀
assets/chevron-right-Bbrt6bNQ.js (New) 207 bytes 207 bytes 100.0% 🚀
assets/lock-Cba3AFh9.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-lbIR5g3I.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-CMUyImft.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-BzzgmyzK.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-BhSob8eE.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/circle-2tVbbVXR.js (New) 130 bytes 130 bytes 100.0% 🚀
assets/tanstack-vendor-Dd7FJmlG.js (Deleted) -725.01kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-zkMBmbcQ.js (Deleted) -75.5kB 0 bytes -100.0% 🗑️
assets/ui-vendor-BohV20Nf.js (Deleted) -65.83kB 0 bytes -100.0% 🗑️
assets/owner-panel-lfBxb-k2.js (Deleted) -58.65kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-configuration-BcLlRbZi.js (Deleted) -48.42kB 0 bytes -100.0% 🗑️
assets/app.analytics-CkaGAJyQ.js (Deleted) -36.26kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-release-checklist-DC0laaVa.js (Deleted) -34.54kB 0 bytes -100.0% 🗑️
assets/docs.tuning-6LytD8Ex.js (Deleted) -34.42kB 0 bytes -100.0% 🗑️
assets/routes-DGBJ5vEN.js (Deleted) -34.04kB 0 bytes -100.0% 🗑️
assets/app.runs-zdsvYLxb.js (Deleted) -27.11kB 0 bytes -100.0% 🗑️
assets/app-BFraeXef.js (Deleted) -25.83kB 0 bytes -100.0% 🗑️
assets/app.operator-ByAJKaHz.js (Deleted) -24.59kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-security-BSl5aOWh.js (Deleted) -21.3kB 0 bytes -100.0% 🗑️
assets/docs.github-app-BAUgnrwa.js (Deleted) -19.49kB 0 bytes -100.0% 🗑️
assets/miner-panel-DsyoX4I5.js (Deleted) -19.23kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-troubleshooting-CkkGTtyB.js (Deleted) -18.47kB 0 bytes -100.0% 🗑️
assets/api._op-BUEpuxRn.js (Deleted) -17.89kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-github-app-Dh9uJHtZ.js (Deleted) -17.32kB 0 bytes -100.0% 🗑️
assets/docs.how-reviews-work-dUN_Pw1V.js (Deleted) -17.03kB 0 bytes -100.0% 🗑️
assets/app.index-DmgOHDv9.js (Deleted) -16.19kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-self-hosting-C2uD6xJm.js (Deleted) -15.99kB 0 bytes -100.0% 🗑️
assets/playground-panel-B5sp9Amn.js (Deleted) -14.43kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-quickstart-D1CEkNKC.js (Deleted) -14.15kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-docs-audit-CgfgadvN.js (Deleted) -12.14kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-install-trust-CKzpZUiI.js (Deleted) -10.51kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-backup-scaling-CMXEnEYz.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/docs.beta-onboarding-B0gTklJe.js (Deleted) -9.95kB 0 bytes -100.0% 🗑️
assets/app.audit-Crx5wfRz.js (Deleted) -9.35kB 0 bytes -100.0% 🗑️
assets/extension-DEBSM6cW.js (Deleted) -9.21kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rees-ClI-lsTF.js (Deleted) -8.95kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-ai-providers-RANOU5L0.js (Deleted) -8.92kB 0 bytes -100.0% 🗑️
assets/app.config-generator-CV54YuxI.js (Deleted) -8.13kB 0 bytes -100.0% 🗑️
assets/maintainers-DokfFsj0.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-BZVYrKOC.js (Deleted) -7.88kB 0 bytes -100.0% 🗑️
assets/agents-DiEHk3_K.js (Deleted) -7.76kB 0 bytes -100.0% 🗑️
assets/docs.privacy-security-xWyfz8xI.js (Deleted) -7.21kB 0 bytes -100.0% 🗑️
assets/docs.owner-checklist-CR_aQoTq.js (Deleted) -7.0kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-unified-ams-orb-DF_Boc5K.js (Deleted) -6.84kB 0 bytes -100.0% 🗑️
assets/commands-panel-ByOdn84W.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-releases-0FNCpnnb.js (Deleted) -6.62kB 0 bytes -100.0% 🗑️
assets/roadmap-00gBF8F4.js (Deleted) -6.33kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rees-analyzers-DOixCUje.js (Deleted) -6.05kB 0 bytes -100.0% 🗑️
assets/digest-panel-D8SelaJz.js (Deleted) -6.04kB 0 bytes -100.0% 🗑️
assets/docs.loopover-commands-Dh8Bt-C9.js (Deleted) -5.18kB 0 bytes -100.0% 🗑️
assets/docs.scoreability-kDaIM49z.js (Deleted) -5.05kB 0 bytes -100.0% 🗑️
assets/docs.troubleshooting-CUWqdvTv.js (Deleted) -4.91kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-T0jBTz8b.js (Deleted) -4.87kB 0 bytes -100.0% 🗑️
assets/api.index-p3kbyq__.js (Deleted) -4.78kB 0 bytes -100.0% 🗑️
assets/docs.index-DceRbbkJ.js (Deleted) -4.74kB 0 bytes -100.0% 🗑️
assets/changelog-C6q2Y-ei.js (Deleted) -4.67kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-workflow-qnnFky7j.js (Deleted) -4.36kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rag-DbV9b7vp.js (Deleted) -4.35kB 0 bytes -100.0% 🗑️
assets/control-primitives-D_-WAg8r.js (Deleted) -3.75kB 0 bytes -100.0% 🗑️
assets/docs.ai-summaries-DtQ-CJBr.js (Deleted) -3.04kB 0 bytes -100.0% 🗑️
assets/docs.branch-analysis-CsJMaMdA.js (Deleted) -2.91kB 0 bytes -100.0% 🗑️
assets/docs.mcp-clients-Ds49dsl6.js (Deleted) -2.9kB 0 bytes -100.0% 🗑️
assets/api-CHVzEetl.js (Deleted) -2.73kB 0 bytes -100.0% 🗑️
assets/docs-fxWwYrko.js (Deleted) -2.67kB 0 bytes -100.0% 🗑️
assets/docs.quickstart-jcErF8XG.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/alert-dialog-DMKApoKO.js (Deleted) -2.07kB 0 bytes -100.0% 🗑️
assets/docs.upstream-drift-DsYVr3bZ.js (Deleted) -2.04kB 0 bytes -100.0% 🗑️
assets/button-dgcXGMho.js (Deleted) -1.74kB 0 bytes -100.0% 🗑️
assets/app.workbench-EqHCeZQR.js (Deleted) -1.63kB 0 bytes -100.0% 🗑️
assets/tooltip-MHnQPK_d.js (Deleted) -1.45kB 0 bytes -100.0% 🗑️
assets/session-DcVdZVRE.js (Deleted) -1.44kB 0 bytes -100.0% 🗑️
assets/tabs-DcSa05WO.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/trend-chart-C4QgjzCk.js (Deleted) -1.22kB 0 bytes -100.0% 🗑️
assets/app.repos-BtFY9CFv.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/switch-CkRLdQuz.js (Deleted) -982 bytes 0 bytes -100.0% 🗑️
assets/analytics-card-shell-B_BQIw4C.js (Deleted) -972 bytes 0 bytes -100.0% 🗑️
assets/use-api-resource-4juxU0Oc.js (Deleted) -934 bytes 0 bytes -100.0% 🗑️
assets/input-zj8yRUcz.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/refresh-meta-BS0PbGEK.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-KyCl0PD9.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-D9wHqBVy.js (Deleted) -501 bytes 0 bytes -100.0% 🗑️
assets/sparkles-BErsEv_A.js (Deleted) -494 bytes 0 bytes -100.0% 🗑️
assets/app.owner-CbEnHDzf.js (Deleted) -473 bytes 0 bytes -100.0% 🗑️
assets/app.commands-BPYbMd_Z.js (Deleted) -454 bytes 0 bytes -100.0% 🗑️
assets/reveal-DZ3L7TzE.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/app.playground--BwDkVcT.js (Deleted) -441 bytes 0 bytes -100.0% 🗑️
assets/index-DWrjhyIX.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/eye-off-BcP_krJY.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.digest-CIR3o2es.js (Deleted) -429 bytes 0 bytes -100.0% 🗑️
assets/app.miner-D1-nFUS1.js (Deleted) -421 bytes 0 bytes -100.0% 🗑️
assets/key-round-C2fPKR3Q.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-Ltf5p0-0.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-DIETZNoG.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-Cpmu9Vp7.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-BLmT3M6K.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/shield-check-DBfzGfRG.js (Deleted) -320 bytes 0 bytes -100.0% 🗑️
assets/wrench-CwUHtOU_.js (Deleted) -303 bytes 0 bytes -100.0% 🗑️
assets/bell-CD5rhYEZ.js (Deleted) -290 bytes 0 bytes -100.0% 🗑️
assets/list-checks-F7r_Alo2.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/shield-CgkJe76W.js (Deleted) -272 bytes 0 bytes -100.0% 🗑️
assets/workflow-7_2LUyF5.js (Deleted) -265 bytes 0 bytes -100.0% 🗑️
assets/chart-column-CyoVbC9w.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/compass-CnlsNEe9.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/skeleton-BPqvBeU1.js (Deleted) -241 bytes 0 bytes -100.0% 🗑️
assets/history-Do-24h6_.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/activity-NCP9FJA7.js (Deleted) -234 bytes 0 bytes -100.0% 🗑️
assets/message-square-CxtEWjd9.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/download-BMm86QRG.js (Deleted) -232 bytes 0 bytes -100.0% 🗑️
assets/chevron-right-Badll0JN.js (Deleted) -207 bytes 0 bytes -100.0% 🗑️
assets/lock-D2iXxDEg.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-zHHqzq2A.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-Bxn6zWs0.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-GmWNY6hM.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-BmyXaNjq.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️
assets/circle-Dnq5FoOf.js (Deleted) -130 bytes 0 bytes -100.0% 🗑️

@codecov

codecov Bot commented Jul 15, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.14286% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 95.31%. Comparing base (42695b3) to head (b974e10).
⚠️ Report is 5 commits behind head on main.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
src/db/schema.ts 66.66% 1 Missing ⚠️

❌ Your patch status has failed because the patch coverage (97.14%) is below the target coverage (99.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #6125   +/-   ##
=======================================
  Coverage   95.31%   95.31%           
=======================================
  Files         595      595           
  Lines       47100    47132   +32     
  Branches    15032    15038    +6     
=======================================
+ Hits        44893    44924   +31     
- Misses       1476     1477    +1     
  Partials      731      731           
Flag Coverage Δ
shard-1 43.97% <14.28%> (-0.03%) ⬇️
shard-2 36.75% <31.42%> (+0.11%) ⬆️
shard-3 32.09% <37.14%> (-0.04%) ⬇️
shard-4 33.94% <14.28%> (+0.49%) ⬆️
shard-5 31.65% <8.57%> (+0.17%) ⬆️
shard-6 44.68% <97.14%> (-0.16%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/api/routes.ts 94.42% <100.00%> (+0.02%) ⬆️
src/auth/github-oauth.ts 95.04% <100.00%> (ø)
src/auth/security.ts 98.87% <100.00%> (+0.01%) ⬆️
src/db/repositories.ts 96.75% <100.00%> (+0.03%) ⬆️
src/openapi/spec.ts 99.43% <100.00%> (+<0.01%) ⬆️
src/db/schema.ts 72.97% <66.66%> (-0.11%) ⬇️

@JSONbored JSONbored self-assigned this Jul 15, 2026
@JSONbored
JSONbored merged commit e4cf37e into main Jul 15, 2026
19 of 20 checks passed
@JSONbored
JSONbored deleted the feat/persist-github-token branch July 15, 2026 11:07
@loopover-orb loopover-orb Bot added the gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. label Jul 15, 2026
jony376 pushed a commit to jony376/gittensory that referenced this pull request Jul 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Persist + expose the GitHub user-to-server token from login instead of discarding it

1 participant