Open
Conversation
The ThemeProvider in apps/web/src/app/layout.tsx is configured with attribute="data-theme", but globals.css declared the Tailwind v4 dark custom-variant against `.dark *` only. As a result, no `.dark` class was ever applied to <html>, and all Tailwind dark:* utilities were dead code — CSS variables flipped via [data-theme="dark"] selectors but Tailwind utilities did not. Extend the dark variant to match both selectors: @custom-variant dark (&:is([data-theme="dark"] *, .dark *)); Blast radius: unlocks ~445 previously-dead dark:* utility occurrences across ~80 files. Also future-proofs a potential migration back to attribute="class" (Next-Themes default) without breaking anything.
Replace the hardcoded 'placeholder' user_id in the timeline page with the authenticated user's Convex id, resolved via useAuth + users.getByWorkOSId. Gate the page with loading and sign-in redirect states so unauthenticated visitors cannot observe another user's commit feed.
Replace the dead Manage Subscription placeholder with a button that POSTs to /api/billing/portal and redirects to the Stripe-hosted customer portal session URL. Surfaces loading and error states so users get feedback when the portal cannot be opened (e.g. no billing account yet).
Bulk-removed ~422 duplicate files and ~74 duplicate directories with
space+digit suffixes (e.g. ` 2.tsx`, ` 3.ts`, `[hash] 2/`) left behind
by macOS Finder / iCloud sync. Categories removed:
- API route duplicates (apps/web/src/app/api/**/{route,verify,webhooks} 2..6)
- Page/layout/globals/middleware/proxy duplicates in apps/web
- Mobile and desktop app duplicates
- services/api, services/agents, services/eval, services/model-router dupes
- packages/db, packages/shared-types, packages/aspendos-openclaw skill dupes
- infra/{docker,helm} 2..5 dirs
- docs concept and getting-started dupes
- klaros subproject dupes
Safety verified: zero static imports (`from '... [2-9]'`) and zero
dynamic imports/requires reference these paths. Typecheck run on
apps/web after deletion — no new errors introduced (pre-existing
unrelated errors in messaging/convex/prisma remain, none point to
a removed file).
Also eliminates an unintended attack surface: Next.js route folders
like `api/webhooks/slack 2/` were reachable as URL-encoded routes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- docs/launch/2026-04-17-production-readiness-plan.md: phased rollout plan synthesized from 5 parallel audit agents - apps/web/src/app/login/layout.tsx, signup/layout.tsx: SEO metadata for WorkOS-backed auth pages (surviving the Clerk→WorkOS revert) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tier 4 canonical SVG variants in /brand/: - yula-mark.svg — primary mark (color, innermost tier = orange #FF8A3D) - yula-mark-mono.svg — theme-adaptive, uses currentColor everywhere - yula-favicon.svg — 32×32 optimized with bg, simplified for OS chrome - yula-wordmark.svg — mark + "yula" Manrope 800 lockup Design rationale: - Aspendos Roman theater cavea silhouette (Anatolian heritage tied to the product's origin). 3-tier amphitheater read as audience witnessing a stage — maps to the audit-log mental model. - The innermost tier is filled with a warm accent (#FF8A3D) honoring the Old Turkic etymology of "yula" = torch/flame (Kutadgu Bilig 1070). Illustrative flame was tried and dropped — the tonal reference is cleaner and avoids literal-shape pitfalls. - Brand-ownable. No other SaaS uses this silhouette. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds scripts/generate-brand-assets.ts (sharp + png-to-ico) that rasterizes
brand/yula-mark.svg and brand/yula-favicon.svg into the full production
asset set under apps/web/public/:
- logo.png (512), logo.svg, favicon.svg, favicon.ico (16/32/48)
- apple-touch-icon.png (180)
- icons/icon-{72,96,128,144,152,192,384,512}.png (both suffixes)
- og/home.png (1200x630 dark OG card with mark + YULA + tagline)
- screenshots/chat-{desktop,mobile}.png placeholders to silence 404s
Run via `bun run brand:generate`.
Delete SiteDock, Dock UI primitive, and unused ShortcutsDock. Strip SiteDock render from marketing layout. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…/Llama 4 Replaces retired model IDs (gpt-4o, claude-3-*, gemini-2.0-flash, llama-3.*, mixtral-8x7b-32768) with the current April 2026 lineup: - OpenAI: gpt-5, gpt-5-mini (display: GPT-5.4) - Anthropic: claude-sonnet-4-6, claude-haiku-4-5, claude-opus-4-7 - Google: gemini-2.5-pro, gemini-2.5-flash - Groq: llama-4-maverick (70B class), llama-4-scout (8B class, router) DEFAULT_* exports preserved. MODEL_REGISTRY, FALLBACK_CHAIN, getModel/getRouterModel/getFallbackRouterModel signatures unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…odels Replace retired llama-3.*, mixtral-8x7b-32768, gpt-4o, claude-3-* keys with gpt-5/gpt-5-mini, claude-sonnet-4-6/haiku-4-5/opus-4-7, llama-4-maverick/scout. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces generic Phosphor glyphs (ChatTeardropDots, Envelope, Lock) in the 'Works everywhere' surfaces grid with real brand marks. - Added apps/web/public/logos/ with 8 SVGs from iconify (logos:* for 6, simple-icons:googlechat + simple-icons:imessage for the two missing ones). - New <PlatformIcon /> client component (apps/web/src/components/platform-icon.tsx): Brandfetch CDN primary (32px@2x), local SVG fallback via onError. - next.config.ts: whitelisted cdn.brandfetch.io in images.remotePatterns. - .env.example: NEXT_PUBLIC_BRANDFETCH_CLIENT_ID documented + optional. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace placeholder 'github.com/aspendos' (nonexistent org) with the actual repo URL in landing CTAs and footer. structured-data.tsx / metadata.ts are owned by the brand-assets agent and intentionally untouched here. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- useAutoRouting model registry, fallbacks, routing heuristics, reasoning strings - lib/ai/router.ts: TIER_MODEL_MAP, constrainModelToTier default, fastRoute models, ROUTER_SYSTEM_PROMPT guidance examples - lib/ai/memory.ts: gpt-4o-mini → gpt-5-mini - lib/ai/generate.ts: createCodingCompletion (Claude Sonnet 4.6), createFastCompletion (gpt-5-mini), sentiment extractor (llama-4-scout) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Textarea min-h-16 -> min-h-10, max-h-48 -> max-h-40 - Wrapper padding p-3/sm:p-4 -> px-3 py-2 / sm:px-4 sm:py-2 - Caption mt-2 -> mt-1 - Header (attachments) now renders conditionally when files.length > 0 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ROUTER_MODEL → llama-4-scout, FALLBACK_ROUTER_MODEL → llama-4-scout. Default model strings across streaming/completion wrappers updated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- PromptInputTools gap-1 -> gap-2 - Insert thin vertical divider between the attachment action menu and the Search/Council/Mode/Voice toolbar group Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
FeaturesIndexPage + CompareIndexPage hero / CTA copy previously pitched 'most advanced unified AI platform' — replaced with the deterministic-agent positioning used on the landing hero (signed, logged, approval-aware, reversible where supported). Model-name lists are untouched (owned by the models-agent). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This 900-line component had 9+ hardcoded hex colors and is not referenced anywhere in the app. Delete rather than tokenize — the project uses ai-elements/prompt-input as the real composer. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
REVERSIBILITY_CLASSES (R0-R4) previously hard-coded hex colors and rgba backgrounds directly in the component, bypassing the theme. Moved to --r0-* through --r4-* CSS variables in globals.css with dedicated dark-mode overrides (slightly brighter/desaturated) so the badges read well in both themes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- model-picker: Yula mode presets → GPT-5/Sonnet 4.6/Haiku 4.5/Gemini 2.5 Flash
- model-selector: default selectedModel → groq/llama-4-maverick
- add-models-modal: OpenAI (GPT-5.4 family), Anthropic (Opus 4.7/Sonnet 4.6/Haiku 4.5),
Google (Gemini 2.5 Pro/Flash/Flash Lite). Removed retired SKUs (Opus 4/4.1/4.5,
Sonnet 4/4.5, GPT-5.1/5.2 family, Gemini 3 previews).
- settings/page: defaultModel → gpt-5, model list refreshed
- yula-store: preferredModels → gpt-5 + claude-opus-4-7
- chat-input label GPT-4o → GPT-5
- computer-use + messaging/bot: claude-sonnet-4-20250514 → claude-sonnet-4-6
- use-gemini-live: gemini-2.0-flash-live → gemini-2.5-flash-live
- step-middleware jsdoc comment: openai('gpt-4o') → openai('gpt-5')
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace hardcoded white/zinc with semantic tokens (bg-card, border-border, text-foreground, text-muted-foreground, bg-foreground/N) so the graph renders correctly in both light and dark themes. Icons that sit on colored category pills keep text-white — that's color-on-color and theme-independent. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The /yula page used hardcoded text-white/bg-white/5 styling that does not flip with theme. It is not linked from anywhere in the app (only mailto:support@yula.dev appears, unrelated). Deleting rather than tokenizing a dead prototype. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- ai-providers: SUPPORTED_MODELS + FALLBACK_CHAIN + downgrades → GPT-5, Claude Opus 4.7 / Sonnet 4.6 / Haiku 4.5, Gemini 2.5 Pro/Flash, Llama 4 family - model-fallback: same chains - cost-tracker MODEL_PRICING + usage-ledger MODEL_PRICING_TABLE updated with recent-public pricing for new model IDs. NOTE: prices should be reviewed against live provider pages before production launch. - context-compression router: llama-3.1-8b-instant → llama-4-scout - webhook-events examples: gpt-4o → gpt-5, gemini-2.0-flash → gemini-2.5-flash, claude-sonnet-4-5 → claude-sonnet-4-6 - openapi-spec enum + examples refreshed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…dels - commitment-detector, memory-agent, council default model IDs - billing.service MODEL_PRICING refreshed (GPT-5/Claude 4.6+4.7+4.5/Gemini 2.5/Llama 4) - council personas: Scholar→llama-4-maverick, Visionary→claude-sonnet-4-6, Pragmatist→llama-4-scout, Devil's Advocate→gpt-5 (cross-provider diversity) - routes/chat, models, council, scheduler, admin default/fallback model IDs - routes/models pinned list refreshed (groq/llama-4 + anthropic/claude-sonnet-4-6 + openai/gpt-5) - validation/chat.schema multiModelSchema default array refreshed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…nt model IDs - tiers.ts supportedModels: gpt-5-mini / claude-haiku-4-5 / gemini-flash - cost-tracker.test: claude-sonnet-4-6, gemini-2.5-flash, llama-4-maverick keys - metrics.test claude-3-5-haiku → claude-haiku-4-5 - Remaining test fixtures across middleware/__tests__, integration/, lib/__tests__, routes/__tests__ rewritten to GPT-5/Claude 4.6-4.7-4.5/ Gemini 2.5/Llama 4 identifiers - council.ts doc comments refreshed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rrent models - README code example: gpt-4o → gpt-5 - packages/sdk JSDoc example: ['gpt-4', 'claude-3'] → ['gpt-5', 'claude-opus-4-7'] - services/eval package.json: gaia:groq → llama-4-maverick, gaia:gpt → gpt-5 - services/agents env.example DEFAULT_MODEL → gpt-5 Note: packages/sdk/README.md is gitignored; skipped. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace bg-white dark:bg-zinc-*, text-zinc-*, border-zinc-* pairs with semantic tokens (bg-background, bg-card, bg-muted, border-border, text-foreground, text-muted-foreground, bg-primary/text-primary-foreground). Now that Wave A made dark: variants fire, these pages render correctly in both themes. Icons on colored category pills keep text-white — color-on-color is theme-independent. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…gpt-5-mini) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace hardcoded white/zinc pairs with semantic tokens (bg-card, bg-muted, border-border, text-foreground, text-muted-foreground) across pac-settings, pac-notification, PACNotifications, and ScheduledIndicator. Keep the one intentional bg-feature-pac text-white pairing — that's a brand color swatch with white icon on it, theme-independent. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace hand-rolled Y-monogram placeholders with the canonical <LogoMark /> component so every branded surface shares one source of truth (brand/yula-mark.svg). Files changed: - apps/web/src/components/chat/chat-sidebar.tsx (header mark, 32px) - apps/web/src/app/chat/page.tsx (EmptyState mark, 40px) - apps/web/src/app/reset-password/page.tsx (auth lockup, 28px mono) - apps/web/src/app/forgot-password/page.tsx (auth lockup, 28px mono) - apps/web/src/app/verify-email/page.tsx (auth lockup, 28px mono) Auth pages use variant="mono" with text-zinc-900 dark:text-zinc-100 on the wrapper so the mark inherits currentColor and keeps the existing light/dark flip. Chat surfaces keep the default color variant (orange inner tier) on text-foreground. No interaction state was removed — the old elements were static presentational <div>s with a <span>, matched 1:1 with the new mark. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Updates Gemini model IDs across the codebase from stale 2.5/2.0 IDs to the current April 2026 lineup verified against ai.google.dev/gemini-api/docs: gemini-2.5-pro -> gemini-3.1-pro-preview (display: Gemini 3.1 Pro) gemini-2.5-flash -> gemini-3-flash-preview (display: Gemini 3 Flash) gemini-2.0-flash -> gemini-3-flash-preview (new) -> gemini-3.1-flash-lite-preview (display: Gemini 3.1 Flash Lite) Also adds gpt-5.4-codex to the OpenAI model list for the unified agentic coding model, updates registry entries, fallback chains, and tier-aware model maps accordingly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Gemini 3 pricing verified against ai.google.dev/gemini-api/docs/pricing (April 2026, standard tier paid): gemini-3.1-pro-preview $2.00 / $12.00 per 1M (<=200k prompt) gemini-3-flash-preview $0.50 / $3.00 per 1M gemini-3.1-flash-lite-preview $0.25 / $1.50 per 1M OpenAI GPT-5.4 pricing could not be fetched from platform.openai.com/docs (403). Using placeholder rates matching previous gpt-5 entries with a TODO(pricing) comment to verify before launch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Updates GPT-4o/GPT-5.2/Gemini 1.5/Gemini 2.0 references in SEO structured data, GEO content, privacy/terms pages, and competitor-comparison pages to the current GPT-5.4 and Gemini 3.x model families. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.