From 9dd32ddca2e35da2f35cff2cf4eebbdae6922c45 Mon Sep 17 00:00:00 2001 From: John | Elite Encoder Date: Mon, 1 Jun 2026 12:27:24 -0400 Subject: [PATCH 1/4] feat(dashboard): add usage capability display and account usage hooks - Implemented `usage-capability-display.ts` for displaying account usage capabilities with color coding and data distribution. - Created `useAccountUsage.ts` hook to manage account usage state and fetch usage data. - Added `useApiKeys.ts` for managing API keys with create and revoke functionality. - Introduced `useDiscoveryModel.ts` and `useExploreModels.ts` for fetching and managing discovery models. - Developed `useSigningSession.ts` for handling signing sessions and token management. - Added discovery client functions in `client.ts` for fetching capabilities and models. - Created configuration and constants files for discovery service. - Implemented mapping functions for transforming discovery capabilities to models. - Defined types for discovery service API responses. - Updated package dependencies and added type definitions for jmuxer and mux.js. --- .env.example | 25 + app/(app)/layout.tsx | 6 +- app/(app)/models/[id]/page.tsx | 54 +- app/(app)/page.tsx | 53 +- app/(app)/usage/page.tsx | 2 +- app/(auth)/device-approved/page.tsx | 29 + app/(auth)/layout.tsx | 6 +- app/(auth)/login/page.tsx | 22 +- app/(auth)/signup/page.tsx | 18 +- app/api/auth/device/complete/route.ts | 71 ++ app/api/auth/initiate-login/route.ts | 58 ++ app/api/discovery/explore/route.ts | 24 + app/api/discovery/models/[id]/route.ts | 48 ++ .../sessions/[id]/publish/[seq]/route.ts | 8 + app/api/gateway/sessions/[id]/route.ts | 7 + .../gateway/sessions/[id]/subscribe/route.ts | 7 + app/api/gateway/sessions/route.ts | 7 + app/api/pymthouse/account-usage/route.ts | 41 + app/api/pymthouse/keys/exchange/route.ts | 43 + app/api/pymthouse/keys/route.ts | 92 ++ .../pymthouse/session/signing-token/route.ts | 45 + app/api/signer/device/exchange/route.ts | 39 + components/dashboard/DashboardProviders.tsx | 18 + components/dashboard/KeysView.tsx | 478 ++++------ components/dashboard/LoginPage.tsx | 102 ++- components/dashboard/SidebarUsageCard.tsx | 128 ++- components/dashboard/SignerSessionContext.tsx | 7 + components/dashboard/UsageView.tsx | 813 ++++++++++-------- components/dashboard/UserSessionContext.tsx | 77 ++ .../dashboard/playground/CodeSnippets.tsx | 26 +- .../playground/LiveStreamPlayground.tsx | 592 +++++++++++++ lib/dashboard/device-flow.ts | 106 +++ lib/dashboard/fetch-signing-token.ts | 58 ++ lib/dashboard/gateway-config.server.ts | 12 + lib/dashboard/gateway-public.ts | 7 + lib/dashboard/model-api-url.ts | 31 + lib/dashboard/playground/stream-capture.ts | 91 ++ lib/dashboard/playground/trickle-mpegts.ts | 504 +++++++++++ lib/dashboard/pymthouse-bff.ts | 202 +++++ lib/dashboard/pymthouse-keys-bff.ts | 183 ++++ lib/dashboard/pymthouse-signing-bff.ts | 119 +++ lib/dashboard/sdk-streaming-example.ts | 131 +++ lib/dashboard/signing-token-storage.ts | 59 ++ lib/dashboard/streaming-playground.ts | 76 ++ lib/dashboard/types.ts | 2 + lib/dashboard/usage-capability-display.ts | 99 +++ lib/dashboard/useAccountUsage.ts | 48 ++ lib/dashboard/useApiKeys.ts | 94 ++ lib/dashboard/useDiscoveryModel.ts | 63 ++ lib/dashboard/useExploreModels.ts | 86 ++ lib/dashboard/useSigningSession.ts | 167 ++++ lib/discovery/client.ts | 102 +++ lib/discovery/config.ts | 7 + lib/discovery/constants.ts | 3 + lib/discovery/map-to-model.ts | 119 +++ lib/discovery/types.ts | 54 ++ package.json | 4 + pnpm-lock.yaml | 64 ++ types/jmuxer.d.ts | 8 + types/muxjs.d.ts | 18 + 60 files changed, 4737 insertions(+), 726 deletions(-) create mode 100644 app/(auth)/device-approved/page.tsx create mode 100644 app/api/auth/device/complete/route.ts create mode 100644 app/api/auth/initiate-login/route.ts create mode 100644 app/api/discovery/explore/route.ts create mode 100644 app/api/discovery/models/[id]/route.ts create mode 100644 app/api/gateway/sessions/[id]/publish/[seq]/route.ts create mode 100644 app/api/gateway/sessions/[id]/route.ts create mode 100644 app/api/gateway/sessions/[id]/subscribe/route.ts create mode 100644 app/api/gateway/sessions/route.ts create mode 100644 app/api/pymthouse/account-usage/route.ts create mode 100644 app/api/pymthouse/keys/exchange/route.ts create mode 100644 app/api/pymthouse/keys/route.ts create mode 100644 app/api/pymthouse/session/signing-token/route.ts create mode 100644 app/api/signer/device/exchange/route.ts create mode 100644 components/dashboard/DashboardProviders.tsx create mode 100644 components/dashboard/SignerSessionContext.tsx create mode 100644 components/dashboard/UserSessionContext.tsx create mode 100644 components/dashboard/playground/LiveStreamPlayground.tsx create mode 100644 lib/dashboard/device-flow.ts create mode 100644 lib/dashboard/fetch-signing-token.ts create mode 100644 lib/dashboard/gateway-config.server.ts create mode 100644 lib/dashboard/gateway-public.ts create mode 100644 lib/dashboard/model-api-url.ts create mode 100644 lib/dashboard/playground/stream-capture.ts create mode 100644 lib/dashboard/playground/trickle-mpegts.ts create mode 100644 lib/dashboard/pymthouse-bff.ts create mode 100644 lib/dashboard/pymthouse-keys-bff.ts create mode 100644 lib/dashboard/pymthouse-signing-bff.ts create mode 100644 lib/dashboard/sdk-streaming-example.ts create mode 100644 lib/dashboard/signing-token-storage.ts create mode 100644 lib/dashboard/streaming-playground.ts create mode 100644 lib/dashboard/usage-capability-display.ts create mode 100644 lib/dashboard/useAccountUsage.ts create mode 100644 lib/dashboard/useApiKeys.ts create mode 100644 lib/dashboard/useDiscoveryModel.ts create mode 100644 lib/dashboard/useExploreModels.ts create mode 100644 lib/dashboard/useSigningSession.ts create mode 100644 lib/discovery/client.ts create mode 100644 lib/discovery/config.ts create mode 100644 lib/discovery/constants.ts create mode 100644 lib/discovery/map-to-model.ts create mode 100644 lib/discovery/types.ts create mode 100644 types/jmuxer.d.ts create mode 100644 types/muxjs.d.ts diff --git a/.env.example b/.env.example index d184751..95de119 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,27 @@ # The Graph (optional — falls back to hardcoded values) THEGRAPH_API_KEY= + +# Discovery Service — Explore capability catalog (legacy pipelines by default). +DISCOVERY_SERVICE_URL=https://discovery-service-production-8955.up.railway.app + +# PymtHouse OIDC (device login + signer JWT exchange facade) +PYMTHOUSE_ISSUER_URL=http://localhost:3001/api/v1/oidc +# Public app client id (OAuth client_id) — used for usage/balance Builder API calls +PYMTHOUSE_PUBLIC_CLIENT_ID= +PYMTHOUSE_M2M_CLIENT_ID= +PYMTHOUSE_M2M_CLIENT_SECRET= +# Initiate login URI for device flow (register on pymthouse app): +# http://localhost:3002/api/auth/initiate-login +# Public signer API for clients (pymthouse proxy — records usage). Not raw DMZ :8080. +PYMTHOUSE_SIGNER_URL=http://localhost:3001/api/signer +# Set to 1 for local dev when issuer uses http://127.0.0.1 +PYMTHOUSE_ALLOW_INSECURE_HTTP= + +# Browser gateway relay (orchestrator LV2V via same-origin HTTP segments) +GATEWAY_ENABLED=0 +NEXT_PUBLIC_GATEWAY_ENABLED=0 +# Optional overrides (defaults to PYMTHOUSE_SIGNER_URL + LIVEPEER_DISCOVERY_SERVICE_URL) +# GATEWAY_DISCOVERY_URL= +# GATEWAY_DISCOVERY_TIMEOUT_MS=60000 +# GATEWAY_USE_TOFU=1 +# GATEWAY_PAYMENT_INTERVAL_MS=2000 diff --git a/app/(app)/layout.tsx b/app/(app)/layout.tsx index f2c91a1..3fb1a91 100644 --- a/app/(app)/layout.tsx +++ b/app/(app)/layout.tsx @@ -2,7 +2,7 @@ import type { Metadata } from "next"; import type { CSSProperties } from "react"; import { GeistSans } from "geist/font/sans"; import { GeistMono } from "geist/font/mono"; -import { AuthProvider } from "@/components/dashboard/AuthContext"; +import { DashboardProviders } from "@/components/dashboard/DashboardProviders"; import { ThemeProvider } from "@/components/dashboard/ThemeContext"; import DashboardSidebar from "@/components/dashboard/DashboardSidebar"; import KeyboardShortcuts from "@/components/dashboard/KeyboardShortcuts"; @@ -58,7 +58,7 @@ export default function DashboardLayout({ paints. ThemeProvider below takes over post-hydration. */}