Skip to content

Conversation

@batmn-dev
Copy link
Owner

@batmn-dev batmn-dev commented Feb 4, 2026

Summary

Major platform overhaul across 44 commits touching 249 files. This branch encompasses a full rebrand, core SDK upgrade, UI redesign, and model catalog modernization.

Rebranding

  • Complete rebrand from vid0 to Not A Wrapper across all code, docs, and assets

AI SDK Upgrade (v4 → v5 → v6)

  • Full migration through Vercel AI SDK v5 transport architecture to v6
  • Migrated useChat hooks, message formats, and streaming responses
  • Removed legacy attachment compatibility, adopted file parts
  • Updated message hydration, text extraction, and tool invocation rendering

Sidebar Redesign

  • ChatGPT-style dual-layer sidebar with collapsible icon mode
  • Scroll shadows, tooltips, refined animation timing and element sizing
  • New SidebarMenuItem component and collapsible sections

Icon System Migration

  • Migrated from Phosphor/Lucide to HugeIcons registry
  • Custom NewChatIcon and refined icon choices throughout
  • Vercel/CI auth setup for HugeIcons private registry

Multi-Chat Input Enhancements

  • Prompt suggestions and file upload controls
  • Model-aware file upload validation (blocks send when unsupported)
  • Inline file review/removal with stable image previews
  • Legacy attachment → file parts conversion on send

Model Catalog Refresh (Feb 2026)

  • Added: Claude Opus 4.6, Sonnet 4.5, Haiku 4.5 · GPT-5.2, 5, 5-Mini, 5-Nano · Gemini 2.5 Flash/Pro, 3 Pro Preview · Grok 4
  • Removed: Deprecated models (Claude 3.5/3.7, GPT-4.5, o1-mini, Grok 3)
  • Updated pricing across all providers and synced provider map/types

Documentation & Agent Context System

  • Structured .agents/ directory with skills, workflows, ADRs, and research
  • Added Cursor rules (.cursor/rules/) for project patterns
  • Architecture Decision Records, glossary, troubleshooting guides
  • Competitive feature analysis and tech stack evaluations

Bug Fixes & Chores

  • Stabilized image previews and multi-chat defaults
  • Fixed tool loading and message text extraction
  • Aligned MCP client usage and dependencies
  • CI/CD fixes for HugeIcons auth in GitHub Actions and Vercel

Test plan

  • Verify chat streaming works end-to-end with AI SDK v6
  • Test sidebar collapse/expand in both desktop and mobile
  • Confirm file uploads blocked for models without support
  • Validate new model entries render correctly in model selector
  • Check rebranding is consistent across all visible UI surfaces

Enable prompt suggestions and file uploads in multi-chat, and simplify model selection controls.
@vercel
Copy link

vercel bot commented Feb 4, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
not-a-wrapper Ready Ready Preview, Comment Feb 7, 2026 4:44am

@greptile-apps
Copy link

greptile-apps bot commented Feb 4, 2026

Greptile Overview

Greptile Summary

This PR enhances the multi-chat input with file upload capabilities and prompt suggestions, while simplifying the model selector UI and removing the minimum favorite model constraint.

Key Changes

  • File Upload Integration: Added file upload controls to multi-chat input with smart validation that checks if selected models support file uploads (vision capability)
  • Prompt Suggestions: Integrated PromptSystem component to show suggestions when the conversation is empty and user preferences enable it
  • Model Selector: Changed from fixed 200px width to flexible auto width for better responsiveness
  • Favorite Models: Removed the restriction that required at least one favorite model, allowing users full control over their favorites list
  • Planning Documentation: Added comprehensive AI SDK v6 upgrade research and planning documents (4 new markdown files with ~5000 lines)

Issues Found

  • State Update During Render (lines 125-127 in multi-chat.tsx): The code calls setSelectedModelIds directly during the render phase, which violates React's rules and will trigger warnings. This should be moved to a useEffect hook.

Confidence Score: 3/5

  • This PR has one critical React rules violation that must be fixed before merging
  • Score reflects a solid feature implementation with good validation logic and UI improvements, but includes a critical bug (state update during render) that will cause React warnings and potential runtime issues. The file upload validation logic is well-designed, and the UI changes are appropriate, but the React violation must be addressed.
  • Pay close attention to app/components/multi-chat/multi-chat.tsx - the state update during render must be fixed

Important Files Changed

Filename Overview
app/components/multi-chat/multi-chat-input.tsx Added file upload controls, prompt suggestions UI, and file upload state validation based on selected models' capabilities
app/components/multi-chat/multi-chat.tsx Integrated file upload hook, added file validation logic before sending, updated message sending to include attachments
app/components/layout/settings/models/models-settings.tsx Removed minimum favorite model constraint, allowing users to remove all favorite models
components/common/multi-model-selector/base.tsx Changed selector width from fixed 200px to auto/flexible for better responsiveness

Sequence Diagram

sequenceDiagram
    participant User
    participant MultiChatInput
    participant MultiChat
    participant useFileUpload
    participant useMultiChat
    participant API as /api/chat

    User->>MultiChatInput: Selects models
    MultiChatInput->>MultiChat: Updates selectedModelIds
    MultiChat->>MultiChat: Calculate fileUploadState
    Note over MultiChat: fileUploadState = "supported"<br/>if all models have vision

    User->>MultiChatInput: Uploads files
    MultiChatInput->>useFileUpload: handleFileUpload(files)
    useFileUpload->>useFileUpload: Update files state

    User->>MultiChatInput: Clicks send or uses suggestion
    MultiChatInput->>MultiChat: onSend() or onSuggestion(text)
    MultiChat->>MultiChat: Validate file upload support
    alt Files exist but not supported
        MultiChat->>User: Show error toast
    else Valid
        MultiChat->>useFileUpload: handleFileUploads(chatId)
        useFileUpload->>API: Upload files to Convex
        API-->>useFileUpload: Return attachments[]
        useFileUpload->>useFileUpload: Clear files state
        
        loop For each selected model
            MultiChat->>useMultiChat: sendMessage(text, files, options)
            useMultiChat->>API: POST with model ID and attachments
            API-->>useMultiChat: Stream response
            useMultiChat->>MultiChat: Update messages
        end
        
        MultiChat->>User: Display responses from all models
    end
Loading

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

Copy link

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 8 files

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them.


<file name="app/components/multi-chat/multi-chat-input.tsx">

<violation number="1" location="app/components/multi-chat/multi-chat-input.tsx:167">
P1: The usage of `FileList` causes a memory leak because `FileItem` (which `FileList` renders) creates unrevoked object URLs on every render. Since `MultiChatInput` updates frequently (on every keystroke), `FileList` and `FileItem` re-render repeatedly, creating thousands of leaked blob URLs if files are attached.

Recommended fix (requires changes to `file-list.tsx` or `file-items.tsx`):
1. Wrap `FileList` in `React.memo` to prevent re-renders when `value` changes.
2. In `FileItem`, use `useEffect` to manage object URLs and revoke them.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

value={value}
onValueChange={onValueChange}
>
<FileList files={files} onFileRemove={onFileRemove} />
Copy link

@cubic-dev-ai cubic-dev-ai bot Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: The usage of FileList causes a memory leak because FileItem (which FileList renders) creates unrevoked object URLs on every render. Since MultiChatInput updates frequently (on every keystroke), FileList and FileItem re-render repeatedly, creating thousands of leaked blob URLs if files are attached.

Recommended fix (requires changes to file-list.tsx or file-items.tsx):

  1. Wrap FileList in React.memo to prevent re-renders when value changes.
  2. In FileItem, use useEffect to manage object URLs and revoke them.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At app/components/multi-chat/multi-chat-input.tsx, line 167:

<comment>The usage of `FileList` causes a memory leak because `FileItem` (which `FileList` renders) creates unrevoked object URLs on every render. Since `MultiChatInput` updates frequently (on every keystroke), `FileList` and `FileItem` re-render repeatedly, creating thousands of leaked blob URLs if files are attached.

Recommended fix (requires changes to `file-list.tsx` or `file-items.tsx`):
1. Wrap `FileList` in `React.memo` to prevent re-renders when `value` changes.
2. In `FileItem`, use `useEffect` to manage object URLs and revoke them.</comment>

<file context>
@@ -80,20 +150,29 @@ export function MultiChatInput({
           value={value}
           onValueChange={onValueChange}
         >
+          <FileList files={files} onFileRemove={onFileRemove} />
           <PromptInputTextarea
             placeholder="Ask all selected models..."
</file context>
Fix with Cubic

Clarifies where AI-generated docs belong and captures competitive research for roadmap decisions.

Co-authored-by: Cursor <cursoragent@cursor.com>
Move side effects into hooks for image previews and default selection. Update competitive analysis notes.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…urrent versions

- Remove old Claude 3.5/3.7 and speculative Claude 4 entries; add Claude Opus 4 and Sonnet 4
- Remove GPT-4.5 Preview and o1-mini from OpenAI; fix o3 SDK mapping
- Remove Grok 3 beta variants (grok-3, grok-3-fast, grok-3-mini, grok-3-mini-fast)
- Remove Gemini preview/experimental models; update Flash 2.0 pricing
- Sync provider-map and types with updated model IDs

Co-authored-by: Cursor <cursoragent@cursor.com>
Add Claude Opus 4.6, Sonnet 4.5, Haiku 4.5; GPT-5.2, GPT-5, GPT-5 Mini,
GPT-5 Nano; Gemini 2.5 Flash/Pro, 3 Pro Preview, 2.0 Flash-Lite;
Grok 4, Grok 4.1 Fast, Grok Code Fast — with types and provider mappings.

Co-authored-by: Cursor <cursoragent@cursor.com>
@batmn-dev batmn-dev changed the title feat: enhance multi-chat input with uploads and suggestions feat: major platform overhaul — rebrand, AI SDK v6, sidebar redesign, model catalog refresh Feb 7, 2026
Refactor FileItem to use lazy URL initialization and ref-based cleanup
instead of useEffect, preventing stale closures. Replace <img> with
Next.js Image component for sidebar user avatar.

Co-authored-by: Cursor <cursoragent@cursor.com>
@batmn-dev
Copy link
Owner Author

@cubic

@cubic-dev-ai
Copy link

cubic-dev-ai bot commented Feb 7, 2026

@cubic

@batmn-dev I have started the AI code review. It will take a few minutes to complete.

Copy link

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 24 files

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them.


<file name="app/components/chat-input/file-items.tsx">

<violation number="1" location="app/components/chat-input/file-items.tsx:45">
P2: Avoid calling setState during render when file changes; it causes render-phase side effects and can trigger warnings or extra renders. Move the object URL update into a `useEffect` that depends on `file`/`isImage`.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

if (imageUrlRef.current) URL.revokeObjectURL(imageUrlRef.current)
const newUrl = isImage ? URL.createObjectURL(file) : null
imageUrlRef.current = newUrl
setImageUrl(newUrl)
Copy link

@cubic-dev-ai cubic-dev-ai bot Feb 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Avoid calling setState during render when file changes; it causes render-phase side effects and can trigger warnings or extra renders. Move the object URL update into a useEffect that depends on file/isImage.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At app/components/chat-input/file-items.tsx, line 45:

<comment>Avoid calling setState during render when file changes; it causes render-phase side effects and can trigger warnings or extra renders. Move the object URL update into a `useEffect` that depends on `file`/`isImage`.</comment>

<file context>
@@ -13,16 +13,47 @@ import {
+    if (imageUrlRef.current) URL.revokeObjectURL(imageUrlRef.current)
+    const newUrl = isImage ? URL.createObjectURL(file) : null
+    imageUrlRef.current = newUrl
+    setImageUrl(newUrl)
+  }
+
</file context>
Fix with Cubic

Replace useRef-based tracking with useState for previous file detection
and let the cleanup effect depend on imageUrl directly, removing the
need for a stale-closure workaround.

Co-authored-by: Cursor <cursoragent@cursor.com>
@batmn-dev batmn-dev merged commit d83701b into main Feb 7, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant