···352352 "connector": {
353353 "status": {
354354 "connecting": "connecting...",
355355- "connected_as": "connected as {'@'}{user}",
355355+ "connected_as": "connected as ~{user}",
356356 "connected": "connected",
357357 "connect_cli": "connect local CLI",
358358 "aria_connecting": "Connecting to local connector",
···364364 "title": "Local Connector",
365365 "close_modal": "Close modal",
366366 "connected": "Connected",
367367- "logged_in_as": "Logged in as {'@'}{user}",
367367+ "connected_as_user": "Connected as ~{user}",
368368 "connected_hint": "You can now manage packages and organizations from the web UI.",
369369 "disconnect": "Disconnect",
370370 "run_hint": "Run the connector on your machine to enable admin features.",
···732732 "description": "Find out the latest on npmx.",
733733 "cta": "Follow on Bluesky"
734734 }
735735+ }
736736+ },
737737+ "account_menu": {
738738+ "connect": "connect",
739739+ "account": "Account",
740740+ "npm_cli": "npm CLI",
741741+ "atmosphere": "Atmosphere",
742742+ "npm_cli_desc": "Manage packages & orgs",
743743+ "atmosphere_desc": "Social features & identity",
744744+ "connect_npm_cli": "Connect to npm CLI",
745745+ "connect_atmosphere": "Connect to Atmosphere",
746746+ "connecting": "Connecting...",
747747+ "ops": "ops",
748748+ "disconnect": "Disconnect"
749749+ },
750750+ "auth": {
751751+ "modal": {
752752+ "title": "Atmosphere",
753753+ "close": "Close",
754754+ "connected_as": "Connected as {'@'}{handle}",
755755+ "disconnect": "Disconnect",
756756+ "connect_prompt": "Connect with your Atmosphere account",
757757+ "handle_label": "Handle",
758758+ "handle_placeholder": "alice.bsky.social",
759759+ "connect": "Connect",
760760+ "create_account": "Create a new account",
761761+ "connect_bluesky": "Connect with Bluesky",
762762+ "what_is_atmosphere": "What is an Atmosphere account?",
763763+ "atmosphere_explanation": "{npmx} uses the {atproto} to power many of its social features, allowing users to own their data and use one account for all compatible applications. Once you create an account, you can use other apps like {bluesky} and {tangled} with the same account."
735764 }
736765 },
737766 "header": {
···352352 "connector": {
353353 "status": {
354354 "connecting": "connecting...",
355355- "connected_as": "connected as {'@'}{user}",
355355+ "connected_as": "connected as ~{user}",
356356 "connected": "connected",
357357 "connect_cli": "connect local CLI",
358358 "aria_connecting": "Connecting to local connector",
···364364 "title": "Local Connector",
365365 "close_modal": "Close modal",
366366 "connected": "Connected",
367367- "logged_in_as": "Logged in as {'@'}{user}",
367367+ "connected_as_user": "Connected as ~{user}",
368368 "connected_hint": "You can now manage packages and organizations from the web UI.",
369369 "disconnect": "Disconnect",
370370 "run_hint": "Run the connector on your machine to enable admin features.",
···732732 "description": "Find out the latest on npmx.",
733733 "cta": "Follow on Bluesky"
734734 }
735735+ }
736736+ },
737737+ "account_menu": {
738738+ "connect": "connect",
739739+ "account": "Account",
740740+ "npm_cli": "npm CLI",
741741+ "atmosphere": "Atmosphere",
742742+ "npm_cli_desc": "Manage packages & orgs",
743743+ "atmosphere_desc": "Social features & identity",
744744+ "connect_npm_cli": "Connect to npm CLI",
745745+ "connect_atmosphere": "Connect to Atmosphere",
746746+ "connecting": "Connecting...",
747747+ "ops": "ops",
748748+ "disconnect": "Disconnect"
749749+ },
750750+ "auth": {
751751+ "modal": {
752752+ "title": "Atmosphere",
753753+ "close": "Close",
754754+ "connected_as": "Connected as {'@'}{handle}",
755755+ "disconnect": "Disconnect",
756756+ "connect_prompt": "Connect with your Atmosphere account",
757757+ "handle_label": "Handle",
758758+ "handle_placeholder": "alice.bsky.social",
759759+ "connect": "Connect",
760760+ "create_account": "Create a new account",
761761+ "connect_bluesky": "Connect with Bluesky",
762762+ "what_is_atmosphere": "What is an Atmosphere account?",
763763+ "atmosphere_explanation": "{npmx} uses the {atproto} to power many of its social features, allowing users to own their data and use one account for all compatible applications. Once you create an account, you can use other apps like {bluesky} and {tangled} with the same account."
735764 }
736765 },
737766 "header": {
···11+import { object, string, pipe, url } from 'valibot'
22+import type { InferOutput } from 'valibot'
33+44+export const UserSessionSchema = object({
55+ did: string(),
66+ handle: string(),
77+ pds: pipe(string(), url()),
88+})
99+1010+export type UserSession = InferOutput<typeof UserSessionSchema>
+5
shared/utils/constants.ts
···1616export const NPM_MISSING_README_SENTINEL = 'ERROR: No README data found!'
1717export const ERROR_JSR_FETCH_FAILED = 'Failed to fetch package from JSR registry.'
1818export const ERROR_NPM_FETCH_FAILED = 'Failed to fetch package from npm registry.'
1919+export const UNSET_NUXT_SESSION_PASSWORD = 'NUXT_SESSION_PASSWORD not set'
1920/** @public */
2021export const ERROR_SUGGESTIONS_FETCH_FAILED = 'Failed to fetch suggestions.'
2222+2323+// microcosm services
2424+export const CONSTELLATION_ENDPOINT = 'https://constellation.microcosm.blue'
2525+export const SLINGSHOT_ENDPOINT = 'https://slingshot.microcosm.blue'
21262227// Theming
2328export const ACCENT_COLORS = {
+5
shared/utils/fetch-cache-config.ts
···55 * using Nitro's storage layer (backed by Vercel's runtime cache in production).
66 */
7788+import { CONSTELLATION_ENDPOINT, SLINGSHOT_ENDPOINT } from './constants'
99+810/**
911 * Domains that should have their fetch responses cached.
1012 * Only requests to these domains will be intercepted and cached.
···2426 'api.bitbucket.org', // Bitbucket API
2527 'codeberg.org', // Codeberg (Gitea-based)
2628 'gitee.com', // Gitee API
2929+ // microcosm endpoints for atproto data
3030+ CONSTELLATION_ENDPOINT,
3131+ SLINGSHOT_ENDPOINT,
2732] as const
28332934/**