From 80f54f83f53ab64f5aa7218c7195f94ccbce6d97 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Tue, 9 Dec 2025 11:07:24 +1100 Subject: [PATCH 001/286] Switch to manual release workflow: disable auto-versioning, fix electron build race condition --- .github/workflows/electron.yml | 47 +++++++++++++++++++++-------- .github/workflows/update-stable.yml | 22 ++++++-------- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml index 5d0b710b..1cf68746 100644 --- a/.github/workflows/electron.yml +++ b/.github/workflows/electron.yml @@ -61,14 +61,12 @@ jobs: - name: Install dependencies run: pnpm install - # Install Linux dependencies - name: Install Linux dependencies if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y rpm - # Build - name: Build Electron app env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -83,21 +81,46 @@ jobs: fi shell: bash - # Create Release - - name: Create Release - uses: softprops/action-gh-release@v2 + - name: Upload artifacts + uses: actions/upload-artifact@v4 with: - # Use the workflow_dispatch input tag if available, else use the Git ref name. - tag_name: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || github.ref_name }} - # Only branch pushes remain drafts. For workflow_dispatch and tag pushes the release is published. - draft: ${{ github.event_name != 'workflow_dispatch' && github.ref_type == 'branch' }} - # For tag pushes, name the release as "Release ", otherwise "Electron Release". - name: ${{ (github.event_name == 'push' && github.ref_type == 'tag') && format('Release {0}', github.ref_name) || 'Electron Release' }} - files: | + name: electron-${{ runner.os }}-artifacts + path: | dist/*.exe dist/*.dmg dist/*.deb dist/*.AppImage dist/*.zip + dist/*.blockmap + retention-days: 1 + if-no-files-found: warn + + release: + needs: build + runs-on: ubuntu-latest + if: github.event_name == 'push' && github.ref_type == 'tag' + + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Display structure of downloaded files + run: ls -R artifacts + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ github.ref_name }} + draft: false + name: Release ${{ github.ref_name }} + files: | + artifacts/**/*.exe + artifacts/**/*.dmg + artifacts/**/*.deb + artifacts/**/*.AppImage + artifacts/**/*.zip + artifacts/**/*.blockmap env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/update-stable.yml b/.github/workflows/update-stable.yml index 856782d2..c2df1b1b 100644 --- a/.github/workflows/update-stable.yml +++ b/.github/workflows/update-stable.yml @@ -1,16 +1,20 @@ name: Update Stable Branch +# DISABLED: Using manual tag workflow instead +# To re-enable, uncomment the 'on:' section below on: - push: - branches: - - main + workflow_dispatch: + +# on: +# push: +# branches: +# - main permissions: contents: write jobs: prepare-release: - if: contains(github.event.head_commit.message, '#release') runs-on: ubuntu-latest steps: @@ -60,14 +64,8 @@ jobs: - name: Determine Version Bump id: version_bump run: | - COMMIT_MSG="${{ github.event.head_commit.message }}" - if [[ $COMMIT_MSG =~ "#release:major" ]]; then - echo "bump=major" >> $GITHUB_OUTPUT - elif [[ $COMMIT_MSG =~ "#release:minor" ]]; then - echo "bump=minor" >> $GITHUB_OUTPUT - else - echo "bump=patch" >> $GITHUB_OUTPUT - fi + # Default to patch since this workflow is now manual only + echo "bump=patch" >> $GITHUB_OUTPUT - name: Bump Version id: bump_version From 67be32e1714e1e44091d6609b92c2b542816d3a0 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Tue, 9 Dec 2025 11:22:11 +1100 Subject: [PATCH 002/286] updated error releases --- app/routes/api.update.ts | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/routes/api.update.ts b/app/routes/api.update.ts index c646ccd8..2dcad40b 100644 --- a/app/routes/api.update.ts +++ b/app/routes/api.update.ts @@ -1,6 +1,6 @@ import { json, type ActionFunction } from '@remix-run/cloudflare'; -const CURRENT_VERSION = '1.1.21'; +const CURRENT_VERSION = '1.1.23'; const GITHUB_REPO = 'codinit-dev/codinit-dev'; interface GitHubRelease { diff --git a/package.json b/package.json index 4eb68aab..b9dcec0e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "license": "MIT", "sideEffects": false, "type": "module", - "version": "1.1.22", + "version": "1.1.23", "author": { "name": "Gerome-Elassaad", "email": "contact@codinit.dev" From 55ec531ae86a10f3d0e6f896586023ff88412aa8 Mon Sep 17 00:00:00 2001 From: Gerome <186273274+Gerome-Elassaad@users.noreply.github.com> Date: Wed, 10 Dec 2025 10:10:59 +1100 Subject: [PATCH 003/286] Fix links and update image in README.md Updated image and repository links in README. --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0ec2cf57..1c0649a8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -codinit-image +hero-image +

@@ -29,7 +30,7 @@ Get up and running with **CodinIT.dev** in just a few steps. ### 1️⃣ Clone the Repository ```bash -git clone https://github.com/Gerome-Elassaad/codinit-app.git +git clone https://github.com/codinit-dev/codinit-dev.git cd codinit-app ```` @@ -109,7 +110,7 @@ docker compose --profile development up ### Run as Desktop App Download the latest release: -👉 [https://github.com/Gerome-Elassaad/codinit-app/releases/latest](https://github.com/Gerome-Elassaad/codinit-app/releases/latest) +👉 [Latest Release](https://github.com/codinit-dev/codinit-dev/releases/latest) --- From c3dedb11ef2577cbd76c421569ae12079f4bd082 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:02:45 +1100 Subject: [PATCH 004/286] removed image --- public/social_preview_index.png | Bin 441152 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/social_preview_index.png diff --git a/public/social_preview_index.png b/public/social_preview_index.png deleted file mode 100644 index 1ec1f06765bee5c441bc742949d6e82093bb6e5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441152 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%0D4wE_c2T#S9uEFbtc>KOOl$^+`~!y21QE4 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%0A7u3+yR4rJn~!+Q!kQnX9la$B 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 From f94720a2ed4721bf3ccff28cf809499597d75889 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:16:12 +1100 Subject: [PATCH 005/286] Remove duplicate service-status directory and components --- .../service-status/ServiceStatusTab.tsx | 135 --------------- .../providers/service-status/base-provider.ts | 121 -------------- .../service-status/provider-factory.ts | 154 ------------------ .../providers/amazon-bedrock.ts | 76 --------- .../service-status/providers/anthropic.ts | 80 --------- .../service-status/providers/cohere.ts | 91 ----------- .../service-status/providers/deepseek.ts | 40 ----- .../service-status/providers/google.ts | 77 --------- .../service-status/providers/groq.ts | 72 -------- .../service-status/providers/huggingface.ts | 98 ----------- .../service-status/providers/hyperbolic.ts | 40 ----- .../service-status/providers/mistral.ts | 76 --------- .../service-status/providers/openai.ts | 99 ----------- .../service-status/providers/openrouter.ts | 91 ----------- .../service-status/providers/perplexity.ts | 91 ----------- .../service-status/providers/together.ts | 91 ----------- .../providers/service-status/providers/xai.ts | 40 ----- .../tabs/providers/service-status/types.ts | 53 ------ 18 files changed, 1525 deletions(-) delete mode 100644 app/components/@settings/tabs/providers/service-status/ServiceStatusTab.tsx delete mode 100644 app/components/@settings/tabs/providers/service-status/base-provider.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/provider-factory.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/amazon-bedrock.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/anthropic.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/cohere.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/deepseek.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/google.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/groq.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/huggingface.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/hyperbolic.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/mistral.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/openai.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/openrouter.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/perplexity.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/together.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/providers/xai.ts delete mode 100644 app/components/@settings/tabs/providers/service-status/types.ts diff --git a/app/components/@settings/tabs/providers/service-status/ServiceStatusTab.tsx b/app/components/@settings/tabs/providers/service-status/ServiceStatusTab.tsx deleted file mode 100644 index bf5a4988..00000000 --- a/app/components/@settings/tabs/providers/service-status/ServiceStatusTab.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { useState, useEffect } from 'react'; -import type { ServiceStatus } from './types'; -import { ProviderStatusCheckerFactory } from './provider-factory'; - -export default function ServiceStatusTab() { - const [serviceStatuses, setServiceStatuses] = useState([]); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - const checkAllProviders = async () => { - try { - setLoading(true); - setError(null); - - const providers = ProviderStatusCheckerFactory.getProviderNames(); - const statuses: ServiceStatus[] = []; - - for (const provider of providers) { - try { - const checker = ProviderStatusCheckerFactory.getChecker(provider); - const result = await checker.checkStatus(); - - statuses.push({ - provider, - ...result, - lastChecked: new Date().toISOString(), - }); - } catch (err) { - console.error(`Error checking ${provider} status:`, err); - statuses.push({ - provider, - status: 'degraded', - message: 'Unable to check service status', - incidents: ['Error checking service status'], - lastChecked: new Date().toISOString(), - }); - } - } - - setServiceStatuses(statuses); - } catch (err) { - console.error('Error checking provider statuses:', err); - setError('Failed to check service statuses'); - } finally { - setLoading(false); - } - }; - - checkAllProviders(); - - // Set up periodic checks every 5 minutes - const interval = setInterval(checkAllProviders, 5 * 60 * 1000); - - return () => clearInterval(interval); - }, []); - - const getStatusColor = (status: ServiceStatus['status']) => { - switch (status) { - case 'operational': - return 'text-green-500 dark:text-green-400'; - case 'degraded': - return 'text-yellow-500 dark:text-yellow-400'; - case 'down': - return 'text-red-500 dark:text-red-400'; - default: - return 'text-gray-500 dark:text-gray-400'; - } - }; - - const getStatusIcon = (status: ServiceStatus['status']) => { - switch (status) { - case 'operational': - return 'i-ph:check-circle'; - case 'degraded': - return 'i-ph:warning'; - case 'down': - return 'i-ph:x-circle'; - default: - return 'i-ph:question'; - } - }; - - if (loading) { - return ( -
-
-
- ); - } - - if (error) { - return ( -
-
-

{error}

-
- ); - } - - return ( -
-
- {serviceStatuses.map((service) => ( -
-
-

{service.provider}

-
-
- {service.status} -
-
-

{service.message}

- {service.incidents && service.incidents.length > 0 && ( -
-

Recent Incidents:

-
    - {service.incidents.map((incident, index) => ( -
  • {incident}
  • - ))} -
-
- )} -
- Last checked: {new Date(service.lastChecked).toLocaleString()} -
-
- ))} -
-
- ); -} diff --git a/app/components/@settings/tabs/providers/service-status/base-provider.ts b/app/components/@settings/tabs/providers/service-status/base-provider.ts deleted file mode 100644 index dde4bd31..00000000 --- a/app/components/@settings/tabs/providers/service-status/base-provider.ts +++ /dev/null @@ -1,121 +0,0 @@ -import type { ProviderConfig, StatusCheckResult, ApiResponse } from './types'; - -export abstract class BaseProviderChecker { - protected config: ProviderConfig; - - constructor(config: ProviderConfig) { - this.config = config; - } - - protected async checkApiEndpoint( - url: string, - headers?: Record, - testModel?: string, - ): Promise<{ ok: boolean; status: number | string; message?: string; responseTime: number }> { - try { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); - - const startTime = performance.now(); - - // Add common headers - const processedHeaders = { - 'Content-Type': 'application/json', - ...headers, - }; - - const response = await fetch(url, { - method: 'GET', - headers: processedHeaders, - signal: controller.signal, - }); - - const endTime = performance.now(); - const responseTime = endTime - startTime; - - clearTimeout(timeoutId); - - const data = (await response.json()) as ApiResponse; - - if (!response.ok) { - let errorMessage = `API returned status: ${response.status}`; - - if (data.error?.message) { - errorMessage = data.error.message; - } else if (data.message) { - errorMessage = data.message; - } - - return { - ok: false, - status: response.status, - message: errorMessage, - responseTime, - }; - } - - // Different providers have different model list formats - let models: string[] = []; - - if (Array.isArray(data)) { - models = data.map((model: { id?: string; name?: string }) => model.id || model.name || ''); - } else if (data.data && Array.isArray(data.data)) { - models = data.data.map((model) => model.id || model.name || ''); - } else if (data.models && Array.isArray(data.models)) { - models = data.models.map((model) => model.id || model.name || ''); - } else if (data.model) { - models = [data.model]; - } - - if (!testModel || models.length > 0) { - return { - ok: true, - status: response.status, - responseTime, - message: 'API key is valid', - }; - } - - if (testModel && !models.includes(testModel)) { - return { - ok: true, - status: 'model_not_found', - message: `API key is valid (test model ${testModel} not found in ${models.length} available models)`, - responseTime, - }; - } - - return { - ok: true, - status: response.status, - message: 'API key is valid', - responseTime, - }; - } catch (error) { - console.error(`Error checking API endpoint ${url}:`, error); - return { - ok: false, - status: error instanceof Error ? error.message : 'Unknown error', - message: error instanceof Error ? `Connection failed: ${error.message}` : 'Connection failed', - responseTime: 0, - }; - } - } - - protected async checkEndpoint(url: string): Promise<'reachable' | 'unreachable'> { - try { - const response = await fetch(url, { - mode: 'no-cors', - headers: { - Accept: 'text/html', - }, - }); - return response.type === 'opaque' ? 'reachable' : 'unreachable'; - } catch (error) { - console.error(`Error checking ${url}:`, error); - return 'unreachable'; - } - } - - abstract checkStatus(): Promise; -} diff --git a/app/components/@settings/tabs/providers/service-status/provider-factory.ts b/app/components/@settings/tabs/providers/service-status/provider-factory.ts deleted file mode 100644 index 3887781a..00000000 --- a/app/components/@settings/tabs/providers/service-status/provider-factory.ts +++ /dev/null @@ -1,154 +0,0 @@ -import type { ProviderName, ProviderConfig, StatusCheckResult } from './types'; -import { BaseProviderChecker } from './base-provider'; - -import { AmazonBedrockStatusChecker } from './providers/amazon-bedrock'; -import { CohereStatusChecker } from './providers/cohere'; -import { DeepseekStatusChecker } from './providers/deepseek'; -import { GoogleStatusChecker } from './providers/google'; -import { GroqStatusChecker } from './providers/groq'; -import { HuggingFaceStatusChecker } from './providers/huggingface'; -import { HyperbolicStatusChecker } from './providers/hyperbolic'; -import { MistralStatusChecker } from './providers/mistral'; -import { OpenRouterStatusChecker } from './providers/openrouter'; -import { PerplexityStatusChecker } from './providers/perplexity'; -import { TogetherStatusChecker } from './providers/together'; -import { XAIStatusChecker } from './providers/xai'; - -export class ProviderStatusCheckerFactory { - private static _providerConfigs: Record = { - AmazonBedrock: { - statusUrl: 'https://health.aws.amazon.com/health/status', - apiUrl: 'https://bedrock.us-east-1.amazonaws.com/models', - headers: {}, - testModel: 'anthropic.claude-3-sonnet-20240229-v1:0', - }, - Cohere: { - statusUrl: 'https://status.cohere.com/', - apiUrl: 'https://api.cohere.ai/v1/models', - headers: {}, - testModel: 'command', - }, - Deepseek: { - statusUrl: 'https://status.deepseek.com/', - apiUrl: 'https://api.deepseek.com/v1/models', - headers: {}, - testModel: 'deepseek-chat', - }, - Google: { - statusUrl: 'https://status.cloud.google.com/', - apiUrl: 'https://generativelanguage.googleapis.com/v1/models', - headers: {}, - testModel: 'gemini-pro', - }, - Groq: { - statusUrl: 'https://groqstatus.com/', - apiUrl: 'https://api.groq.com/v1/models', - headers: {}, - testModel: 'mixtral-8x7b-32768', - }, - HuggingFace: { - statusUrl: 'https://status.huggingface.co/', - apiUrl: 'https://api-inference.huggingface.co/models', - headers: {}, - testModel: 'mistralai/Mixtral-8x7B-Instruct-v0.1', - }, - Hyperbolic: { - statusUrl: 'https://status.hyperbolic.ai/', - apiUrl: 'https://api.hyperbolic.ai/v1/models', - headers: {}, - testModel: 'hyperbolic-1', - }, - Mistral: { - statusUrl: 'https://status.mistral.ai/', - apiUrl: 'https://api.mistral.ai/v1/models', - headers: {}, - testModel: 'mistral-tiny', - }, - OpenRouter: { - statusUrl: 'https://status.openrouter.ai/', - apiUrl: 'https://openrouter.ai/api/v1/models', - headers: {}, - testModel: 'anthropic/claude-3-sonnet', - }, - Perplexity: { - statusUrl: 'https://status.perplexity.com/', - apiUrl: 'https://api.perplexity.ai/v1/models', - headers: {}, - testModel: 'pplx-7b-chat', - }, - Together: { - statusUrl: 'https://status.together.ai/', - apiUrl: 'https://api.together.xyz/v1/models', - headers: {}, - testModel: 'mistralai/Mixtral-8x7B-Instruct-v0.1', - }, - XAI: { - statusUrl: 'https://status.x.ai/', - apiUrl: 'https://api.x.ai/v1/models', - headers: {}, - testModel: 'grok-1', - }, - }; - - static getChecker(provider: ProviderName): BaseProviderChecker { - const config = this._providerConfigs[provider]; - - if (!config) { - throw new Error(`No configuration found for provider: ${provider}`); - } - - switch (provider) { - case 'AmazonBedrock': - return new AmazonBedrockStatusChecker(config); - case 'Cohere': - return new CohereStatusChecker(config); - case 'Deepseek': - return new DeepseekStatusChecker(config); - case 'Google': - return new GoogleStatusChecker(config); - case 'Groq': - return new GroqStatusChecker(config); - case 'HuggingFace': - return new HuggingFaceStatusChecker(config); - case 'Hyperbolic': - return new HyperbolicStatusChecker(config); - case 'Mistral': - return new MistralStatusChecker(config); - case 'OpenRouter': - return new OpenRouterStatusChecker(config); - case 'Perplexity': - return new PerplexityStatusChecker(config); - case 'Together': - return new TogetherStatusChecker(config); - case 'XAI': - return new XAIStatusChecker(config); - default: - return new (class extends BaseProviderChecker { - async checkStatus(): Promise { - const endpointStatus = await this.checkEndpoint(this.config.statusUrl); - const apiStatus = await this.checkEndpoint(this.config.apiUrl); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - })(config); - } - } - - static getProviderNames(): ProviderName[] { - return Object.keys(this._providerConfigs) as ProviderName[]; - } - - static getProviderConfig(provider: ProviderName): ProviderConfig { - const config = this._providerConfigs[provider]; - - if (!config) { - throw new Error(`Unknown provider: ${provider}`); - } - - return config; - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/amazon-bedrock.ts b/app/components/@settings/tabs/providers/service-status/providers/amazon-bedrock.ts deleted file mode 100644 index dff9d9a1..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/amazon-bedrock.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class AmazonBedrockStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check AWS health status page - const statusPageResponse = await fetch('https://health.aws.amazon.com/health/status'); - const text = await statusPageResponse.text(); - - // Check for Bedrock and general AWS status - const hasBedrockIssues = - text.includes('Amazon Bedrock') && - (text.includes('Service is experiencing elevated error rates') || - text.includes('Service disruption') || - text.includes('Degraded Service')); - - const hasGeneralIssues = text.includes('Service disruption') || text.includes('Multiple services affected'); - - // Extract incidents - const incidents: string[] = []; - const incidentMatches = text.matchAll(/(\d{4}-\d{2}-\d{2})\s+(.*?)\s+Impact:(.*?)(?=\n|$)/g); - - for (const match of incidentMatches) { - const [, date, title, impact] = match; - - if (title.includes('Bedrock') || title.includes('AWS')) { - incidents.push(`${date}: ${title.trim()} - Impact: ${impact.trim()}`); - } - } - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All services operational'; - - if (hasBedrockIssues) { - status = 'degraded'; - message = 'Amazon Bedrock service issues reported'; - } else if (hasGeneralIssues) { - status = 'degraded'; - message = 'AWS experiencing general issues'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://health.aws.amazon.com/health/status'); - const apiEndpoint = 'https://bedrock.us-east-1.amazonaws.com/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents: incidents.slice(0, 5), - }; - } catch (error) { - console.error('Error checking Amazon Bedrock status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://health.aws.amazon.com/health/status'); - const apiEndpoint = 'https://bedrock.us-east-1.amazonaws.com/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/anthropic.ts b/app/components/@settings/tabs/providers/service-status/providers/anthropic.ts deleted file mode 100644 index dccbf66b..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/anthropic.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class AnthropicStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.anthropic.com/'); - const text = await statusPageResponse.text(); - - // Check for specific Anthropic status indicators - const isOperational = text.includes('All Systems Operational'); - const hasDegradedPerformance = text.includes('Degraded Performance'); - const hasPartialOutage = text.includes('Partial Outage'); - const hasMajorOutage = text.includes('Major Outage'); - - // Extract incidents - const incidents: string[] = []; - const incidentSection = text.match(/Past Incidents(.*?)(?=\n\n)/s); - - if (incidentSection) { - const incidentLines = incidentSection[1] - .split('\n') - .map((line) => line.trim()) - .filter((line) => line && line.includes('202')); // Only get dated incidents - - incidents.push(...incidentLines.slice(0, 5)); - } - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (hasMajorOutage) { - status = 'down'; - message = 'Major service outage'; - } else if (hasPartialOutage) { - status = 'down'; - message = 'Partial service outage'; - } else if (hasDegradedPerformance) { - status = 'degraded'; - message = 'Service experiencing degraded performance'; - } else if (!isOperational) { - status = 'degraded'; - message = 'Service status unknown'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.anthropic.com/'); - const apiEndpoint = 'https://api.anthropic.com/v1/messages'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents, - }; - } catch (error) { - console.error('Error checking Anthropic status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.anthropic.com/'); - const apiEndpoint = 'https://api.anthropic.com/v1/messages'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/cohere.ts b/app/components/@settings/tabs/providers/service-status/providers/cohere.ts deleted file mode 100644 index 7707f737..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/cohere.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class CohereStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.cohere.com/'); - const text = await statusPageResponse.text(); - - // Check for specific Cohere status indicators - const isOperational = text.includes('All Systems Operational'); - const hasIncidents = text.includes('Active Incidents'); - const hasDegradation = text.includes('Degraded Performance'); - const hasOutage = text.includes('Service Outage'); - - // Extract incidents - const incidents: string[] = []; - const incidentSection = text.match(/Past Incidents(.*?)(?=\n\n)/s); - - if (incidentSection) { - const incidentLines = incidentSection[1] - .split('\n') - .map((line) => line.trim()) - .filter((line) => line && line.includes('202')); // Only get dated incidents - - incidents.push(...incidentLines.slice(0, 5)); - } - - // Check specific services - const services = { - api: { - operational: text.includes('API Service') && text.includes('Operational'), - degraded: text.includes('API Service') && text.includes('Degraded Performance'), - outage: text.includes('API Service') && text.includes('Service Outage'), - }, - generation: { - operational: text.includes('Generation Service') && text.includes('Operational'), - degraded: text.includes('Generation Service') && text.includes('Degraded Performance'), - outage: text.includes('Generation Service') && text.includes('Service Outage'), - }, - }; - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (services.api.outage || services.generation.outage || hasOutage) { - status = 'down'; - message = 'Service outage detected'; - } else if (services.api.degraded || services.generation.degraded || hasDegradation || hasIncidents) { - status = 'degraded'; - message = 'Service experiencing issues'; - } else if (!isOperational) { - status = 'degraded'; - message = 'Service status unknown'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.cohere.com/'); - const apiEndpoint = 'https://api.cohere.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents, - }; - } catch (error) { - console.error('Error checking Cohere status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.cohere.com/'); - const apiEndpoint = 'https://api.cohere.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/deepseek.ts b/app/components/@settings/tabs/providers/service-status/providers/deepseek.ts deleted file mode 100644 index 7aa88bac..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/deepseek.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class DeepseekStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - /* - * Check status page - Note: Deepseek doesn't have a public status page yet - * so we'll check their API endpoint directly - */ - const apiEndpoint = 'https://api.deepseek.com/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - // Check their website as a secondary indicator - const websiteStatus = await this.checkEndpoint('https://deepseek.com'); - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (apiStatus !== 'reachable' || websiteStatus !== 'reachable') { - status = apiStatus !== 'reachable' ? 'down' : 'degraded'; - message = apiStatus !== 'reachable' ? 'API appears to be down' : 'Service may be experiencing issues'; - } - - return { - status, - message, - incidents: [], // No public incident tracking available yet - }; - } catch (error) { - console.error('Error checking Deepseek status:', error); - - return { - status: 'degraded', - message: 'Unable to determine service status', - incidents: ['Note: Limited status information available'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/google.ts b/app/components/@settings/tabs/providers/service-status/providers/google.ts deleted file mode 100644 index 80b5ecf8..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/google.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class GoogleStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.cloud.google.com/'); - const text = await statusPageResponse.text(); - - // Check for Vertex AI and general cloud status - const hasVertexAIIssues = - text.includes('Vertex AI') && - (text.includes('Incident') || - text.includes('Disruption') || - text.includes('Outage') || - text.includes('degraded')); - - const hasGeneralIssues = text.includes('Major Incidents') || text.includes('Service Disruption'); - - // Extract incidents - const incidents: string[] = []; - const incidentMatches = text.matchAll(/(\d{4}-\d{2}-\d{2})\s+(.*?)\s+Impact:(.*?)(?=\n|$)/g); - - for (const match of incidentMatches) { - const [, date, title, impact] = match; - - if (title.includes('Vertex AI') || title.includes('Cloud')) { - incidents.push(`${date}: ${title.trim()} - Impact: ${impact.trim()}`); - } - } - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All services operational'; - - if (hasVertexAIIssues) { - status = 'degraded'; - message = 'Vertex AI service issues reported'; - } else if (hasGeneralIssues) { - status = 'degraded'; - message = 'Google Cloud experiencing issues'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.cloud.google.com/'); - const apiEndpoint = 'https://generativelanguage.googleapis.com/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents: incidents.slice(0, 5), - }; - } catch (error) { - console.error('Error checking Google status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.cloud.google.com/'); - const apiEndpoint = 'https://generativelanguage.googleapis.com/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/groq.ts b/app/components/@settings/tabs/providers/service-status/providers/groq.ts deleted file mode 100644 index c465cedd..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/groq.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class GroqStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://groqstatus.com/'); - const text = await statusPageResponse.text(); - - const isOperational = text.includes('All Systems Operational'); - const hasIncidents = text.includes('Active Incidents'); - const hasDegradation = text.includes('Degraded Performance'); - const hasOutage = text.includes('Service Outage'); - - // Extract incidents - const incidents: string[] = []; - const incidentMatches = text.matchAll(/(\d{4}-\d{2}-\d{2})\s+(.*?)\s+Status:(.*?)(?=\n|$)/g); - - for (const match of incidentMatches) { - const [, date, title, status] = match; - incidents.push(`${date}: ${title.trim()} - ${status.trim()}`); - } - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (hasOutage) { - status = 'down'; - message = 'Service outage detected'; - } else if (hasDegradation || hasIncidents) { - status = 'degraded'; - message = 'Service experiencing issues'; - } else if (!isOperational) { - status = 'degraded'; - message = 'Service status unknown'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://groqstatus.com/'); - const apiEndpoint = 'https://api.groq.com/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents: incidents.slice(0, 5), - }; - } catch (error) { - console.error('Error checking Groq status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://groqstatus.com/'); - const apiEndpoint = 'https://api.groq.com/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/huggingface.ts b/app/components/@settings/tabs/providers/service-status/providers/huggingface.ts deleted file mode 100644 index 80dcfe84..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/huggingface.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class HuggingFaceStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.huggingface.co/'); - const text = await statusPageResponse.text(); - - // Check for "All services are online" message - const allServicesOnline = text.includes('All services are online'); - - // Get last update time - const lastUpdateMatch = text.match(/Last updated on (.*?)(EST|PST|GMT)/); - const lastUpdate = lastUpdateMatch ? `${lastUpdateMatch[1]}${lastUpdateMatch[2]}` : ''; - - // Check individual services and their uptime percentages - const services = { - 'Huggingface Hub': { - operational: text.includes('Huggingface Hub') && text.includes('Operational'), - uptime: text.match(/Huggingface Hub[\s\S]*?(\d+\.\d+)%\s*uptime/)?.[1], - }, - 'Git Hosting and Serving': { - operational: text.includes('Git Hosting and Serving') && text.includes('Operational'), - uptime: text.match(/Git Hosting and Serving[\s\S]*?(\d+\.\d+)%\s*uptime/)?.[1], - }, - 'Inference API': { - operational: text.includes('Inference API') && text.includes('Operational'), - uptime: text.match(/Inference API[\s\S]*?(\d+\.\d+)%\s*uptime/)?.[1], - }, - 'HF Endpoints': { - operational: text.includes('HF Endpoints') && text.includes('Operational'), - uptime: text.match(/HF Endpoints[\s\S]*?(\d+\.\d+)%\s*uptime/)?.[1], - }, - Spaces: { - operational: text.includes('Spaces') && text.includes('Operational'), - uptime: text.match(/Spaces[\s\S]*?(\d+\.\d+)%\s*uptime/)?.[1], - }, - }; - - // Create service status messages with uptime - const serviceMessages = Object.entries(services).map(([name, info]) => { - if (info.uptime) { - return `${name}: ${info.uptime}% uptime`; - } - - return `${name}: ${info.operational ? 'Operational' : 'Issues detected'}`; - }); - - // Determine overall status - let status: StatusCheckResult['status'] = 'operational'; - let message = allServicesOnline - ? `All services are online (Last updated on ${lastUpdate})` - : 'Checking individual services'; - - // Only mark as degraded if we explicitly detect issues - const hasIssues = Object.values(services).some((service) => !service.operational); - - if (hasIssues) { - status = 'degraded'; - message = `Service issues detected (Last updated on ${lastUpdate})`; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.huggingface.co/'); - const apiEndpoint = 'https://api-inference.huggingface.co/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents: serviceMessages, - }; - } catch (error) { - console.error('Error checking HuggingFace status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.huggingface.co/'); - const apiEndpoint = 'https://api-inference.huggingface.co/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/hyperbolic.ts b/app/components/@settings/tabs/providers/service-status/providers/hyperbolic.ts deleted file mode 100644 index 6dca268f..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/hyperbolic.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class HyperbolicStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - /* - * Check API endpoint directly since Hyperbolic is a newer provider - * and may not have a public status page yet - */ - const apiEndpoint = 'https://api.hyperbolic.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - // Check their website as a secondary indicator - const websiteStatus = await this.checkEndpoint('https://hyperbolic.ai'); - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (apiStatus !== 'reachable' || websiteStatus !== 'reachable') { - status = apiStatus !== 'reachable' ? 'down' : 'degraded'; - message = apiStatus !== 'reachable' ? 'API appears to be down' : 'Service may be experiencing issues'; - } - - return { - status, - message, - incidents: [], // No public incident tracking available yet - }; - } catch (error) { - console.error('Error checking Hyperbolic status:', error); - - return { - status: 'degraded', - message: 'Unable to determine service status', - incidents: ['Note: Limited status information available'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/mistral.ts b/app/components/@settings/tabs/providers/service-status/providers/mistral.ts deleted file mode 100644 index 5966682c..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/mistral.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class MistralStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.mistral.ai/'); - const text = await statusPageResponse.text(); - - const isOperational = text.includes('All Systems Operational'); - const hasIncidents = text.includes('Active Incidents'); - const hasDegradation = text.includes('Degraded Performance'); - const hasOutage = text.includes('Service Outage'); - - // Extract incidents - const incidents: string[] = []; - const incidentSection = text.match(/Recent Events(.*?)(?=\n\n)/s); - - if (incidentSection) { - const incidentLines = incidentSection[1] - .split('\n') - .map((line) => line.trim()) - .filter((line) => line && !line.includes('No incidents')); - - incidents.push(...incidentLines.slice(0, 5)); - } - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (hasOutage) { - status = 'down'; - message = 'Service outage detected'; - } else if (hasDegradation || hasIncidents) { - status = 'degraded'; - message = 'Service experiencing issues'; - } else if (!isOperational) { - status = 'degraded'; - message = 'Service status unknown'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.mistral.ai/'); - const apiEndpoint = 'https://api.mistral.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents, - }; - } catch (error) { - console.error('Error checking Mistral status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.mistral.ai/'); - const apiEndpoint = 'https://api.mistral.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/openai.ts b/app/components/@settings/tabs/providers/service-status/providers/openai.ts deleted file mode 100644 index 252c16ea..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/openai.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class OpenAIStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.openai.com/'); - const text = await statusPageResponse.text(); - - // Check individual services - const services = { - api: { - operational: text.includes('API ? Operational'), - degraded: text.includes('API ? Degraded Performance'), - outage: text.includes('API ? Major Outage') || text.includes('API ? Partial Outage'), - }, - chat: { - operational: text.includes('ChatGPT ? Operational'), - degraded: text.includes('ChatGPT ? Degraded Performance'), - outage: text.includes('ChatGPT ? Major Outage') || text.includes('ChatGPT ? Partial Outage'), - }, - }; - - // Extract recent incidents - const incidents: string[] = []; - const incidentMatches = text.match(/Past Incidents(.*?)(?=\w+ \d+, \d{4})/s); - - if (incidentMatches) { - const recentIncidents = incidentMatches[1] - .split('\n') - .map((line) => line.trim()) - .filter((line) => line && line.includes('202')); // Get only dated incidents - - incidents.push(...recentIncidents.slice(0, 5)); - } - - // Determine overall status - let status: StatusCheckResult['status'] = 'operational'; - const messages: string[] = []; - - if (services.api.outage || services.chat.outage) { - status = 'down'; - - if (services.api.outage) { - messages.push('API: Major Outage'); - } - - if (services.chat.outage) { - messages.push('ChatGPT: Major Outage'); - } - } else if (services.api.degraded || services.chat.degraded) { - status = 'degraded'; - - if (services.api.degraded) { - messages.push('API: Degraded Performance'); - } - - if (services.chat.degraded) { - messages.push('ChatGPT: Degraded Performance'); - } - } else if (services.api.operational) { - messages.push('API: Operational'); - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.openai.com/'); - const apiEndpoint = 'https://api.openai.com/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message: messages.join(', ') || 'Status unknown', - incidents, - }; - } catch (error) { - console.error('Error checking OpenAI status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.openai.com/'); - const apiEndpoint = 'https://api.openai.com/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/openrouter.ts b/app/components/@settings/tabs/providers/service-status/providers/openrouter.ts deleted file mode 100644 index f05edb98..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/openrouter.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class OpenRouterStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.openrouter.ai/'); - const text = await statusPageResponse.text(); - - // Check for specific OpenRouter status indicators - const isOperational = text.includes('All Systems Operational'); - const hasIncidents = text.includes('Active Incidents'); - const hasDegradation = text.includes('Degraded Performance'); - const hasOutage = text.includes('Service Outage'); - - // Extract incidents - const incidents: string[] = []; - const incidentSection = text.match(/Past Incidents(.*?)(?=\n\n)/s); - - if (incidentSection) { - const incidentLines = incidentSection[1] - .split('\n') - .map((line) => line.trim()) - .filter((line) => line && line.includes('202')); // Only get dated incidents - - incidents.push(...incidentLines.slice(0, 5)); - } - - // Check specific services - const services = { - api: { - operational: text.includes('API Service') && text.includes('Operational'), - degraded: text.includes('API Service') && text.includes('Degraded Performance'), - outage: text.includes('API Service') && text.includes('Service Outage'), - }, - routing: { - operational: text.includes('Routing Service') && text.includes('Operational'), - degraded: text.includes('Routing Service') && text.includes('Degraded Performance'), - outage: text.includes('Routing Service') && text.includes('Service Outage'), - }, - }; - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (services.api.outage || services.routing.outage || hasOutage) { - status = 'down'; - message = 'Service outage detected'; - } else if (services.api.degraded || services.routing.degraded || hasDegradation || hasIncidents) { - status = 'degraded'; - message = 'Service experiencing issues'; - } else if (!isOperational) { - status = 'degraded'; - message = 'Service status unknown'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.openrouter.ai/'); - const apiEndpoint = 'https://openrouter.ai/api/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents, - }; - } catch (error) { - console.error('Error checking OpenRouter status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.openrouter.ai/'); - const apiEndpoint = 'https://openrouter.ai/api/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/perplexity.ts b/app/components/@settings/tabs/providers/service-status/providers/perplexity.ts deleted file mode 100644 index 31a8088e..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/perplexity.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class PerplexityStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.perplexity.ai/'); - const text = await statusPageResponse.text(); - - // Check for specific Perplexity status indicators - const isOperational = text.includes('All Systems Operational'); - const hasIncidents = text.includes('Active Incidents'); - const hasDegradation = text.includes('Degraded Performance'); - const hasOutage = text.includes('Service Outage'); - - // Extract incidents - const incidents: string[] = []; - const incidentSection = text.match(/Past Incidents(.*?)(?=\n\n)/s); - - if (incidentSection) { - const incidentLines = incidentSection[1] - .split('\n') - .map((line) => line.trim()) - .filter((line) => line && line.includes('202')); // Only get dated incidents - - incidents.push(...incidentLines.slice(0, 5)); - } - - // Check specific services - const services = { - api: { - operational: text.includes('API Service') && text.includes('Operational'), - degraded: text.includes('API Service') && text.includes('Degraded Performance'), - outage: text.includes('API Service') && text.includes('Service Outage'), - }, - inference: { - operational: text.includes('Inference Service') && text.includes('Operational'), - degraded: text.includes('Inference Service') && text.includes('Degraded Performance'), - outage: text.includes('Inference Service') && text.includes('Service Outage'), - }, - }; - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (services.api.outage || services.inference.outage || hasOutage) { - status = 'down'; - message = 'Service outage detected'; - } else if (services.api.degraded || services.inference.degraded || hasDegradation || hasIncidents) { - status = 'degraded'; - message = 'Service experiencing issues'; - } else if (!isOperational) { - status = 'degraded'; - message = 'Service status unknown'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.perplexity.ai/'); - const apiEndpoint = 'https://api.perplexity.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents, - }; - } catch (error) { - console.error('Error checking Perplexity status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.perplexity.ai/'); - const apiEndpoint = 'https://api.perplexity.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/together.ts b/app/components/@settings/tabs/providers/service-status/providers/together.ts deleted file mode 100644 index 77abce98..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/together.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class TogetherStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - // Check status page - const statusPageResponse = await fetch('https://status.together.ai/'); - const text = await statusPageResponse.text(); - - // Check for specific Together status indicators - const isOperational = text.includes('All Systems Operational'); - const hasIncidents = text.includes('Active Incidents'); - const hasDegradation = text.includes('Degraded Performance'); - const hasOutage = text.includes('Service Outage'); - - // Extract incidents - const incidents: string[] = []; - const incidentSection = text.match(/Past Incidents(.*?)(?=\n\n)/s); - - if (incidentSection) { - const incidentLines = incidentSection[1] - .split('\n') - .map((line) => line.trim()) - .filter((line) => line && line.includes('202')); // Only get dated incidents - - incidents.push(...incidentLines.slice(0, 5)); - } - - // Check specific services - const services = { - api: { - operational: text.includes('API Service') && text.includes('Operational'), - degraded: text.includes('API Service') && text.includes('Degraded Performance'), - outage: text.includes('API Service') && text.includes('Service Outage'), - }, - inference: { - operational: text.includes('Inference Service') && text.includes('Operational'), - degraded: text.includes('Inference Service') && text.includes('Degraded Performance'), - outage: text.includes('Inference Service') && text.includes('Service Outage'), - }, - }; - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (services.api.outage || services.inference.outage || hasOutage) { - status = 'down'; - message = 'Service outage detected'; - } else if (services.api.degraded || services.inference.degraded || hasDegradation || hasIncidents) { - status = 'degraded'; - message = 'Service experiencing issues'; - } else if (!isOperational) { - status = 'degraded'; - message = 'Service status unknown'; - } - - // If status page check fails, fallback to endpoint check - if (!statusPageResponse.ok) { - const endpointStatus = await this.checkEndpoint('https://status.together.ai/'); - const apiEndpoint = 'https://api.together.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - - return { - status, - message, - incidents, - }; - } catch (error) { - console.error('Error checking Together status:', error); - - // Fallback to basic endpoint check - const endpointStatus = await this.checkEndpoint('https://status.together.ai/'); - const apiEndpoint = 'https://api.together.ai/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - return { - status: endpointStatus === 'reachable' && apiStatus === 'reachable' ? 'operational' : 'degraded', - message: `Status page: ${endpointStatus}, API: ${apiStatus}`, - incidents: ['Note: Limited status information due to CORS restrictions'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/providers/xai.ts b/app/components/@settings/tabs/providers/service-status/providers/xai.ts deleted file mode 100644 index 7b98c6a3..00000000 --- a/app/components/@settings/tabs/providers/service-status/providers/xai.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { BaseProviderChecker } from '~/components/@settings/tabs/providers/service-status/base-provider'; -import type { StatusCheckResult } from '~/components/@settings/tabs/providers/service-status/types'; - -export class XAIStatusChecker extends BaseProviderChecker { - async checkStatus(): Promise { - try { - /* - * Check API endpoint directly since XAI is a newer provider - * and may not have a public status page yet - */ - const apiEndpoint = 'https://api.xai.com/v1/models'; - const apiStatus = await this.checkEndpoint(apiEndpoint); - - // Check their website as a secondary indicator - const websiteStatus = await this.checkEndpoint('https://x.ai'); - - let status: StatusCheckResult['status'] = 'operational'; - let message = 'All systems operational'; - - if (apiStatus !== 'reachable' || websiteStatus !== 'reachable') { - status = apiStatus !== 'reachable' ? 'down' : 'degraded'; - message = apiStatus !== 'reachable' ? 'API appears to be down' : 'Service may be experiencing issues'; - } - - return { - status, - message, - incidents: [], // No public incident tracking available yet - }; - } catch (error) { - console.error('Error checking XAI status:', error); - - return { - status: 'degraded', - message: 'Unable to determine service status', - incidents: ['Note: Limited status information available'], - }; - } - } -} diff --git a/app/components/@settings/tabs/providers/service-status/types.ts b/app/components/@settings/tabs/providers/service-status/types.ts deleted file mode 100644 index 4561caae..00000000 --- a/app/components/@settings/tabs/providers/service-status/types.ts +++ /dev/null @@ -1,53 +0,0 @@ -export type ProviderName = - | 'AmazonBedrock' - | 'Cohere' - | 'Deepseek' - | 'Google' - | 'Groq' - | 'HuggingFace' - | 'Hyperbolic' - | 'Mistral' - | 'OpenRouter' - | 'Perplexity' - | 'Together' - | 'XAI'; - -export type ServiceStatus = { - provider: ProviderName; - status: 'operational' | 'degraded' | 'down'; - lastChecked: string; - statusUrl?: string; - icon?: string; - message?: string; - responseTime?: number; - incidents?: string[]; -}; - -export interface ProviderConfig { - statusUrl: string; - apiUrl: string; - headers: Record; - testModel: string; -} - -export type ApiResponse = { - error?: { - message: string; - }; - message?: string; - model?: string; - models?: Array<{ - id?: string; - name?: string; - }>; - data?: Array<{ - id?: string; - name?: string; - }>; -}; - -export type StatusCheckResult = { - status: 'operational' | 'degraded' | 'down'; - message: string; - incidents: string[]; -}; From c2050e1693032df8115f716abd4e966740d8be9d Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:16:28 +1100 Subject: [PATCH 006/286] Remove unused CreateBranchDialog component --- .../components/CreateBranchDialog.tsx | 155 ------------------ 1 file changed, 155 deletions(-) delete mode 100644 app/components/@settings/tabs/connections/components/CreateBranchDialog.tsx diff --git a/app/components/@settings/tabs/connections/components/CreateBranchDialog.tsx b/app/components/@settings/tabs/connections/components/CreateBranchDialog.tsx deleted file mode 100644 index 08a17302..00000000 --- a/app/components/@settings/tabs/connections/components/CreateBranchDialog.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { useState } from 'react'; -import * as Dialog from '@radix-ui/react-dialog'; -import { classNames } from '~/utils/classNames'; -import type { GitHubRepoInfo } from '~/components/@settings/tabs/connections/types/GitHub'; - -interface GitHubBranch { - name: string; - default?: boolean; -} - -interface CreateBranchDialogProps { - isOpen: boolean; - onClose: () => void; - onConfirm: (branchName: string, sourceBranch: string) => void; - repository: GitHubRepoInfo; - branches?: GitHubBranch[]; -} - -export function CreateBranchDialog({ isOpen, onClose, onConfirm, repository, branches }: CreateBranchDialogProps) { - const [branchName, setBranchName] = useState(''); - const [sourceBranch, setSourceBranch] = useState(branches?.find((b) => b.default)?.name || 'main'); - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - onConfirm(branchName, sourceBranch); - setBranchName(''); - onClose(); - }; - - return ( - - - - - - Create New Branch - - - Create a new branch from the current commit - - -
-
-
- - setBranchName(e.target.value)} - placeholder="feature/my-new-branch" - className={classNames( - 'w-full px-3 py-2 rounded-lg', - 'bg-[#F5F5F5] dark:bg-[#1A1A1A]', - 'border border-[#E5E5E5] dark:border-[#1A1A1A]', - 'text-codinit-elements-textPrimary placeholder:text-codinit-elements-textTertiary', - 'focus:outline-none focus:ring-2 focus:ring-blue-500/50', - )} - required - /> -
- -
- - -
- -
-

Branch Overview

-
    -
  • -
    - Repository: {repository.name} -
  • - {branchName && ( -
  • -
    - New branch will be created as: {branchName} -
  • - )} -
  • -
    - Based on: {sourceBranch} -
  • -
-
-
- -
- - -
-
-
-
-
- ); -} From ad8fb6dca980b0d52c3841909ffcfca30e015d95 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:16:44 +1100 Subject: [PATCH 007/286] Remove unused CustomTitleBar component --- app/components/ui/CustomTitleBar.tsx | 159 --------------------------- 1 file changed, 159 deletions(-) delete mode 100644 app/components/ui/CustomTitleBar.tsx diff --git a/app/components/ui/CustomTitleBar.tsx b/app/components/ui/CustomTitleBar.tsx deleted file mode 100644 index 8d5aa918..00000000 --- a/app/components/ui/CustomTitleBar.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useState } from 'react'; -import { classNames } from '~/utils/classNames'; - -declare global { - interface Window { - electronAPI?: { - minimize: () => void; - maximize: () => void; - close: () => void; - isMaximized: () => Promise; - getPlatform: () => Promise; - onMaximize: (callback: () => void) => () => void; - onUnmaximize: (callback: () => void) => () => void; - offMaximize: (callback: () => void) => void; - offUnmaximize: (callback: () => void) => void; - }; - } -} - -export function CustomTitleBar() { - const [isMaximized, setIsMaximized] = useState(false); - const [platform, setPlatform] = useState<'win32' | 'darwin' | 'linux'>('darwin'); - - useEffect(() => { - // Check if running in Electron - if (typeof window !== 'undefined' && window.electronAPI) { - // Get platform info - window.electronAPI.getPlatform().then((plat: string) => { - setPlatform(plat as 'win32' | 'darwin' | 'linux'); - }); - - // Listen for window state changes - const handleMaximize = () => setIsMaximized(true); - const handleUnmaximize = () => setIsMaximized(false); - - const cleanupMaximize = window.electronAPI.onMaximize(handleMaximize); - const cleanupUnmaximize = window.electronAPI.onUnmaximize(handleUnmaximize); - - // Check initial state - window.electronAPI.isMaximized().then(setIsMaximized); - - return () => { - cleanupMaximize(); - cleanupUnmaximize(); - }; - } - - return undefined; - }, []); - - const handleMinimize = () => { - if (window.electronAPI) { - window.electronAPI.minimize(); - } - }; - - const handleMaximize = () => { - if (window.electronAPI) { - window.electronAPI.maximize(); - } - }; - - const handleClose = () => { - if (window.electronAPI) { - window.electronAPI.close(); - } - }; - - // Only show on Electron platforms - if (typeof window === 'undefined' || !window.electronAPI) { - return null; - } - - return ( -
- {/* Left side - Window controls (macOS style) */} - {platform === 'darwin' && ( -
-
- )} - - {/* Center - App title */} -
-
- CodinIT - CodinIT - CodinIT.dev -
-
- - {/* Right side - Window controls (Windows/Linux style) */} - {platform !== 'darwin' && ( -
- - - -
- )} -
- ); -} From 7293a46034c86d0664b56c267605f777bd720962 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:16:59 +1100 Subject: [PATCH 008/286] Remove unused ElectronWindowControls component --- app/components/ui/ElectronWindowControls.tsx | 134 ------------------- 1 file changed, 134 deletions(-) delete mode 100644 app/components/ui/ElectronWindowControls.tsx diff --git a/app/components/ui/ElectronWindowControls.tsx b/app/components/ui/ElectronWindowControls.tsx deleted file mode 100644 index c2094f7d..00000000 --- a/app/components/ui/ElectronWindowControls.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { useEffect, useState } from 'react'; -import { classNames } from '~/utils/classNames'; - -declare global { - interface Window { - electronAPI?: { - minimize: () => void; - maximize: () => void; - close: () => void; - isMaximized: () => Promise; - getPlatform: () => Promise; - onMaximize: (callback: () => void) => () => void; - onUnmaximize: (callback: () => void) => () => void; - offMaximize: (callback: () => void) => void; - offUnmaximize: (callback: () => void) => void; - }; - } -} - -interface ElectronWindowControlsProps { - className?: string; -} - -export function ElectronWindowControls({ className }: ElectronWindowControlsProps) { - const [isMaximized, setIsMaximized] = useState(false); - const [platform, setPlatform] = useState<'win32' | 'darwin' | 'linux'>('darwin'); - - useEffect(() => { - if (typeof window !== 'undefined' && window.electronAPI) { - window.electronAPI.getPlatform().then((plat: string) => { - setPlatform(plat as 'win32' | 'darwin' | 'linux'); - }); - - const handleMaximize = () => setIsMaximized(true); - const handleUnmaximize = () => setIsMaximized(false); - - const cleanupMaximize = window.electronAPI.onMaximize(handleMaximize); - const cleanupUnmaximize = window.electronAPI.onUnmaximize(handleUnmaximize); - - window.electronAPI.isMaximized().then(setIsMaximized); - - return () => { - cleanupMaximize(); - cleanupUnmaximize(); - }; - } - - return undefined; - }, []); - - const handleMinimize = () => { - if (window.electronAPI) { - window.electronAPI.minimize(); - } - }; - - const handleMaximize = () => { - if (window.electronAPI) { - window.electronAPI.maximize(); - } - }; - - const handleClose = () => { - if (window.electronAPI) { - window.electronAPI.close(); - } - }; - - if (typeof window === 'undefined' || !window.electronAPI) { - return null; - } - - if (platform === 'darwin') { - return ( -
-
- ); - } - - return ( -
- - - -
- ); -} From 11f098d8e02b9259b84b094951c1e6af9945dd0f Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:17:10 +1100 Subject: [PATCH 009/286] Remove duplicate demo.tsx file --- app/components/ui/demo.tsx | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 app/components/ui/demo.tsx diff --git a/app/components/ui/demo.tsx b/app/components/ui/demo.tsx deleted file mode 100644 index de60331d..00000000 --- a/app/components/ui/demo.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { TextShimmer } from '~/components/ui/text-shimmer'; - -function TextShimmerBasic() { - return ( - - Generating code... - - ); -} - -function TextShimmerColor() { - return ( - - Generating... - - ); -} - -export default { - TextShimmerBasic, - TextShimmerColor, -}; From dc30beb59cc0641efa57d2b86f6f72d6a8820429 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:17:27 +1100 Subject: [PATCH 010/286] Remove duplicate TextShimmer.tsx demo file --- app/components/ui/TextShimmer.tsx | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 app/components/ui/TextShimmer.tsx diff --git a/app/components/ui/TextShimmer.tsx b/app/components/ui/TextShimmer.tsx deleted file mode 100644 index 00655737..00000000 --- a/app/components/ui/TextShimmer.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { TextShimmer } from '~/components/ui/text-shimmer'; - -function TextShimmerBasic() { - return ( - - Generating... - - ); -} - -function TextShimmerColor() { - return ( - - Generating... - - ); -} - -export default { - TextShimmerBasic, - TextShimmerColor, -}; From a0a2f7463aaefc6c132bd248299d72741d9e6130 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:17:49 +1100 Subject: [PATCH 011/286] Remove unused ui/CodeBlock component --- app/components/ui/CodeBlock.tsx | 103 -------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 app/components/ui/CodeBlock.tsx diff --git a/app/components/ui/CodeBlock.tsx b/app/components/ui/CodeBlock.tsx deleted file mode 100644 index ed886650..00000000 --- a/app/components/ui/CodeBlock.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import React, { useState } from 'react'; -import { classNames } from '~/utils/classNames'; -import { motion } from 'framer-motion'; -import { FileIcon } from './FileIcon'; -import { Tooltip } from './Tooltip'; - -interface CodeBlockProps { - code: string; - language?: string; - filename?: string; - showLineNumbers?: boolean; - highlightLines?: number[]; - maxHeight?: string; - className?: string; - onCopy?: () => void; -} - -export function CodeBlock({ - code, - language, - filename, - showLineNumbers = true, - highlightLines = [], - maxHeight = '400px', - className, - onCopy, -}: CodeBlockProps) { - const [copied, setCopied] = useState(false); - - const handleCopy = () => { - navigator.clipboard.writeText(code); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - onCopy?.(); - }; - - const lines = code.split('\n'); - - return ( -
- {/* Header */} -
-
- {filename && ( - <> - - - {filename} - - - )} - {language && !filename && ( - - {language} - - )} -
- - - {copied ? : } - - -
- - {/* Code content */} -
- - - {lines.map((line, index) => ( - - {showLineNumbers && ( - - )} - - - ))} - -
- {index + 1} - - {line || ' '} -
-
-
- ); -} From 4ac9bb10c840a7f540b611942441e714c9151039 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:18:05 +1100 Subject: [PATCH 012/286] Remove unused SearchResultItem component --- app/components/ui/SearchResultItem.tsx | 134 ------------------------- 1 file changed, 134 deletions(-) delete mode 100644 app/components/ui/SearchResultItem.tsx diff --git a/app/components/ui/SearchResultItem.tsx b/app/components/ui/SearchResultItem.tsx deleted file mode 100644 index 0ecdaed8..00000000 --- a/app/components/ui/SearchResultItem.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import React from 'react'; -import { motion } from 'framer-motion'; -import { classNames } from '~/utils/classNames'; -import { Badge } from './Badge'; - -interface SearchResultItemProps { - title: string; - subtitle?: string; - description?: string; - icon?: string; - iconBackground?: string; - iconColor?: string; - tags?: string[]; - metadata?: Array<{ - icon?: string; - label: string; - value?: string | number; - }>; - actionLabel?: string; - onAction?: () => void; - onClick?: () => void; - className?: string; -} - -export function SearchResultItem({ - title, - subtitle, - description, - icon, - iconBackground = 'bg-codinit-elements-background-depth-1/80 dark:bg-codinit-elements-background-depth-4/80', - iconColor = 'text-blue-500', - tags, - metadata, - actionLabel, - onAction, - onClick, - className, -}: SearchResultItemProps) { - return ( - -
-
- {icon && ( -
- -
- )} -
-

- {title} -

- {subtitle && ( -

- {subtitle} -

- )} -
-
- - {actionLabel && onAction && ( - { - e.stopPropagation(); - onAction(); - }} - className="px-4 py-2 h-9 rounded-lg bg-blue-500 text-white hover:bg-blue-600 transition-all duration-200 flex items-center gap-2 min-w-[100px] justify-center text-sm shadow-sm hover:shadow-md" - whileHover={{ scale: 1.05 }} - whileTap={{ scale: 0.95 }} - > - {actionLabel} - - )} -
- - {description && ( -
-

- {description} -

-
- )} - - {tags && tags.length > 0 && ( -
- {tags.map((tag) => ( - - {tag} - - ))} -
- )} - - {metadata && metadata.length > 0 && ( -
- {metadata.map((item, index) => ( -
- {item.icon && } - - {item.label} - {item.value !== undefined && ': '} - {item.value !== undefined && ( - - {item.value} - - )} - -
- ))} -
- )} -
- ); -} From d4c62725904863b918a7a1e87cb7cb2b83cdb5a1 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:18:18 +1100 Subject: [PATCH 013/286] Remove unused Separator component --- app/components/ui/Separator.tsx | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 app/components/ui/Separator.tsx diff --git a/app/components/ui/Separator.tsx b/app/components/ui/Separator.tsx deleted file mode 100644 index 60fd8e25..00000000 --- a/app/components/ui/Separator.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import * as SeparatorPrimitive from '@radix-ui/react-separator'; -import { classNames } from '~/utils/classNames'; - -interface SeparatorProps { - className?: string; - orientation?: 'horizontal' | 'vertical'; -} - -export const Separator = ({ className, orientation = 'horizontal' }: SeparatorProps) => { - return ( - - ); -}; - -export default Separator; From ce36d1595b6e8f239e908c6c0f353e55421edd3f Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:18:29 +1100 Subject: [PATCH 014/286] Remove unused Slider component --- app/components/ui/Slider.tsx | 73 ------------------------------------ 1 file changed, 73 deletions(-) delete mode 100644 app/components/ui/Slider.tsx diff --git a/app/components/ui/Slider.tsx b/app/components/ui/Slider.tsx deleted file mode 100644 index 3b94ae16..00000000 --- a/app/components/ui/Slider.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { motion } from 'framer-motion'; -import { memo } from 'react'; -import { classNames } from '~/utils/classNames'; -import { cubicEasingFn } from '~/utils/easings'; -import { genericMemo } from '~/utils/react'; - -export type SliderOptions = { - left: { value: T; text: string | JSX.Element }; - middle?: { value: T; text: string | JSX.Element }; - right: { value: T; text: string | JSX.Element }; -}; - -interface SliderProps { - selected: T; - options: SliderOptions; - setSelected?: (selected: T) => void; -} - -export const Slider = genericMemo(({ selected, options, setSelected }: SliderProps) => { - const hasMiddle = !!options.middle; - const isLeftSelected = hasMiddle ? selected === options.left.value : selected === options.left.value; - const isMiddleSelected = hasMiddle && options.middle ? selected === options.middle.value : false; - - return ( -
- setSelected?.(options.left.value)}> - {options.left.text} - - - {options.middle && ( - setSelected?.(options.middle!.value)}> - {options.middle.text} - - )} - - setSelected?.(options.right.value)} - > - {options.right.text} - -
- ); -}); - -interface SliderButtonProps { - selected: boolean; - children: string | JSX.Element | Array; - setSelected: () => void; -} - -const SliderButton = memo(({ selected, children, setSelected }: SliderButtonProps) => { - return ( - - ); -}); From 69cc3328e3a487c5a929602188c18769c9f323e0 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:18:40 +1100 Subject: [PATCH 015/286] Remove unused GradientCard component --- app/components/ui/GradientCard.tsx | 100 ----------------------------- 1 file changed, 100 deletions(-) delete mode 100644 app/components/ui/GradientCard.tsx diff --git a/app/components/ui/GradientCard.tsx b/app/components/ui/GradientCard.tsx deleted file mode 100644 index 74f53c28..00000000 --- a/app/components/ui/GradientCard.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import React from 'react'; -import { motion } from 'framer-motion'; -import { classNames } from '~/utils/classNames'; - -// Predefined gradient colors -const GRADIENT_COLORS = [ - 'from-blue-500/10 to-blue-500/5', - 'from-blue-500/10 to-cyan-500/5', - 'from-cyan-500/10 to-green-500/5', - 'from-green-500/10 to-yellow-500/5', - 'from-yellow-500/10 to-orange-500/5', - 'from-orange-500/10 to-red-500/5', - 'from-red-500/10 to-pink-500/5', - 'from-pink-500/10 to-blue-500/5', -]; - -interface GradientCardProps { - /** Custom gradient class (overrides seed-based gradient) */ - gradient?: string; - - /** Seed string to determine gradient color */ - seed?: string; - - /** Whether to apply hover animation effect */ - hoverEffect?: boolean; - - /** Whether to apply border effect */ - borderEffect?: boolean; - - /** Card content */ - children: React.ReactNode; - - /** Additional class name */ - className?: string; - - /** Additional props */ - [key: string]: any; -} - -/** - * GradientCard component - * - * A card with a gradient background that can be determined by a seed string. - */ -export function GradientCard({ - gradient, - seed, - hoverEffect = true, - borderEffect = true, - className, - children, - ...props -}: GradientCardProps) { - // Get gradient color based on seed or use provided gradient - const gradientClass = gradient || getGradientColorFromSeed(seed); - - // Animation variants for hover effect - const hoverAnimation = hoverEffect - ? { - whileHover: { - scale: 1.02, - y: -2, - transition: { type: 'spring', stiffness: 400, damping: 17 }, - }, - whileTap: { scale: 0.98 }, - } - : undefined; - - return ( - - {children} - - ); -} - -/** - * Calculate a gradient color based on the seed string for visual variety - */ -function getGradientColorFromSeed(seedString?: string): string { - if (!seedString) { - return GRADIENT_COLORS[0]; - } - - const index = seedString.length % GRADIENT_COLORS.length; - - return GRADIENT_COLORS[index]; -} From 3f120140391bb6b57dfae56dff15f7117eaf04d5 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:18:51 +1100 Subject: [PATCH 016/286] Remove unused WorkspaceModal component --- app/components/ui/WorkspaceModal.tsx | 247 --------------------------- 1 file changed, 247 deletions(-) delete mode 100644 app/components/ui/WorkspaceModal.tsx diff --git a/app/components/ui/WorkspaceModal.tsx b/app/components/ui/WorkspaceModal.tsx deleted file mode 100644 index ab53a2c3..00000000 --- a/app/components/ui/WorkspaceModal.tsx +++ /dev/null @@ -1,247 +0,0 @@ -import React, { useState } from 'react'; -import * as Dialog from '@radix-ui/react-dialog'; -import { motion } from 'framer-motion'; -import { classNames } from '~/utils/classNames'; - -// Import actual settings components -import ProfileTab from '~/components/@settings/tabs/profile/ProfileTab'; -import SettingsTab from '~/components/@settings/tabs/settings/SettingsTab'; -import NotificationsTab from '~/components/@settings/tabs/notifications/NotificationsTab'; -import FeaturesTab from '~/components/@settings/tabs/features/FeaturesTab'; -import { DataTab } from '~/components/@settings/tabs/data/DataTab'; -import DebugTab from '~/components/@settings/tabs/debug/DebugTab'; -import { EventLogsTab } from '~/components/@settings/tabs/event-logs/EventLogsTab'; -import UpdateTab from '~/components/@settings/tabs/update/UpdateTab'; -import ConnectionsTab from '~/components/@settings/tabs/connections/ConnectionsTab'; -import CloudProvidersTab from '~/components/@settings/tabs/providers/cloud/CloudProvidersTab'; -import ServiceStatusTab from '~/components/@settings/tabs/providers/status/ServiceStatusTab'; -import LocalProvidersTab from '~/components/@settings/tabs/providers/local/LocalProvidersTab'; -import TaskManagerTab from '~/components/@settings/tabs/task-manager/TaskManagerTab'; - -interface TabItem { - id: string; - label: string; - icon: React.ReactNode; - section?: string; - component?: React.ComponentType; -} - -interface WorkspaceModalProps { - isOpen: boolean; - onClose: () => void; - children?: React.ReactNode; -} - -const tabs: TabItem[] = [ - // Workspace section - { id: 'workspace', label: 'Workspace', icon:
, section: 'Workspace' }, - { id: 'people', label: 'People', icon:
, section: 'Workspace' }, - { id: 'billing', label: 'Plans & credits', icon:
, section: 'Workspace' }, - { id: 'usage', label: 'Cloud & AI balance', icon:
, section: 'Workspace' }, - { - id: 'privacy-security', - label: 'Privacy & security', - icon:
, - section: 'Workspace', - }, - - // Account section - { - id: 'account', - label: 'Account', - icon:
, - section: 'Account', - component: ProfileTab, - }, - { - id: 'settings', - label: 'Settings', - icon:
, - section: 'Account', - component: SettingsTab, - }, - { - id: 'notifications', - label: 'Notifications', - icon:
, - section: 'Account', - component: NotificationsTab, - }, - { - id: 'features', - label: 'Features', - icon:
, - section: 'Account', - component: FeaturesTab, - }, - { - id: 'data', - label: 'Data', - icon:
, - section: 'Account', - component: DataTab, - }, - { - id: 'connection', - label: 'Connections', - icon:
, - section: 'Account', - component: ConnectionsTab, - }, - { id: 'debug', label: 'Debug', icon:
, section: 'Account', component: DebugTab }, - { - id: 'event-logs', - label: 'Event Logs', - icon:
, - section: 'Account', - component: EventLogsTab, - }, - { - id: 'update', - label: 'Update', - icon:
, - section: 'Account', - component: UpdateTab, - }, - - // Tools section - { id: 'tools', label: 'Tools', icon:
, section: 'Tools' }, - { id: 'labs', label: 'Labs', icon:
, section: 'Labs' }, - - // Providers section - { - id: 'cloud-providers', - label: 'Cloud Providers', - icon:
, - section: 'Providers', - component: CloudProvidersTab, - }, - { - id: 'local-providers', - label: 'Local Providers', - icon:
, - section: 'Providers', - component: LocalProvidersTab, - }, - { - id: 'service-status', - label: 'Service Status', - icon:
, - section: 'Providers', - component: ServiceStatusTab, - }, - { - id: 'task-manager', - label: 'Task Manager', - icon:
, - section: 'Providers', - component: TaskManagerTab, - }, - - // Integrations section - { id: 'supabase', label: 'Supabase', icon:
, section: 'Integrations' }, - { id: 'github', label: 'GitHub', icon:
, section: 'Integrations' }, -]; - -export function WorkspaceModal({ isOpen, onClose, children }: WorkspaceModalProps) { - const [activeTab, setActiveTab] = useState('account'); - - const groupedTabs = tabs.reduce( - (acc, tab) => { - const section = tab.section || 'Other'; - - if (!acc[section]) { - acc[section] = []; - } - - acc[section].push(tab); - - return acc; - }, - {} as Record, - ); - - const activeTabData = tabs.find((tab) => tab.id === activeTab); - const ActiveComponent = activeTabData?.component; - - const renderTabContent = () => { - if (children) { - return children; - } - - if (ActiveComponent) { - return ; - } - - // Default content for tabs without components - return ( -
-
- {activeTabData?.icon} -
-

{activeTabData?.label || 'Content'}

-

This feature is coming soon. Check back later!

-
- ); - }; - - return ( - - - -
- - - Workspace settings and configuration - {/* Sidebar */} -
-
- {Object.entries(groupedTabs).map(([section, sectionTabs]) => ( -
- {section !== 'Workspace' && ( -
- {section} -
- )} -
- {sectionTabs.map((tab) => ( - - ))} -
-
- ))} -
-
- - {/* Content */} -
-
-
{renderTabContent()}
-
-
-
-
-
-
-
- ); -} From 18b30efa0ab4d095e4256f423b243cc0ddc674d3 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:19:02 +1100 Subject: [PATCH 017/286] Remove unused TypingAnimation component --- app/components/chat/TypingAnimation.tsx | 60 ------------------------- 1 file changed, 60 deletions(-) delete mode 100644 app/components/chat/TypingAnimation.tsx diff --git a/app/components/chat/TypingAnimation.tsx b/app/components/chat/TypingAnimation.tsx deleted file mode 100644 index e082f574..00000000 --- a/app/components/chat/TypingAnimation.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useEffect, useState } from 'react'; - -const EXAMPLE_PROMPTS = ['Tip: Select a starter template to get started quickly!']; - -interface TypingAnimationProps { - onPromptClick?: (prompt: string) => void; -} - -export function TypingAnimation({ onPromptClick: _onPromptClick }: TypingAnimationProps) { - const [currentPromptIndex, setCurrentPromptIndex] = useState(0); - const [displayedText, setDisplayedText] = useState(''); - const [isDeleting, setIsDeleting] = useState(false); - const [isPaused, setIsPaused] = useState(false); - - useEffect(() => { - const currentPrompt = EXAMPLE_PROMPTS[currentPromptIndex]; - - if (isPaused) { - const pauseTimer = setTimeout(() => { - setIsPaused(false); - setIsDeleting(true); - }, 2000); - return () => clearTimeout(pauseTimer); - } - - if (!isDeleting && displayedText === currentPrompt) { - setIsPaused(true); - return undefined; - } - - if (isDeleting && displayedText === '') { - setIsDeleting(false); - setCurrentPromptIndex((prev) => (prev + 1) % EXAMPLE_PROMPTS.length); - - return undefined; - } - - const timeout = setTimeout( - () => { - if (isDeleting) { - setDisplayedText(currentPrompt.substring(0, displayedText.length - 1)); - } else { - setDisplayedText(currentPrompt.substring(0, displayedText.length + 1)); - } - }, - isDeleting ? 30 : 50, - ); - - return () => clearTimeout(timeout); - }, [displayedText, isDeleting, isPaused, currentPromptIndex]); - - return ( -
-
- {displayedText} - -
-
- ); -} From e156652df0b7a49958affbd562884179f0da15cd Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:19:35 +1100 Subject: [PATCH 018/286] Update ui/index.ts to remove exports for deleted components --- app/components/ui/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/components/ui/index.ts b/app/components/ui/index.ts index 2fe69145..daf76ba4 100644 --- a/app/components/ui/index.ts +++ b/app/components/ui/index.ts @@ -23,14 +23,11 @@ export * from './text-shimmer'; // New components export * from './Breadcrumbs'; export * from './CloseButton'; -export * from './CodeBlock'; export * from './EmptyState'; export * from './FileIcon'; export * from './FilterChip'; -export * from './GradientCard'; export * from './RepositoryStats'; export * from './SearchInput'; -export * from './SearchResultItem'; export * from './StatusIndicator'; export * from './TabsWithSlider'; From fb7e9d42903073f67dd59e9038399d954be47491 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:26:41 +1100 Subject: [PATCH 019/286] Fix mixed static/dynamic import warning for CodeMirrorEditor --- app/components/workbench/Workbench.client.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/workbench/Workbench.client.tsx b/app/components/workbench/Workbench.client.tsx index 7d79b5ca..22dc2a47 100644 --- a/app/components/workbench/Workbench.client.tsx +++ b/app/components/workbench/Workbench.client.tsx @@ -6,9 +6,9 @@ import { toast } from 'react-toastify'; import type { ActionRunner } from '~/lib/runtime/action-runner'; import type { FileHistory } from '~/types/actions'; import { DiffView } from './DiffView'; -import { - type OnChangeCallback as OnEditorChange, - type OnScrollCallback as OnEditorScroll, +import type { + OnChangeCallback as OnEditorChange, + OnScrollCallback as OnEditorScroll, } from '~/components/editor/codemirror/CodeMirrorEditor'; import { workbenchStore, type WorkbenchViewType } from '~/lib/stores/workbench'; import { classNames } from '~/utils/classNames'; From c3c889952fc317b3d3a2b137be532ed46ef6b524 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:35:34 +1100 Subject: [PATCH 020/286] Add v3_singleFetch flag to vite.config.ts --- vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.ts b/vite.config.ts index 62db5f4f..3790270b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -125,6 +125,7 @@ export default defineConfig((config) => { v3_relativeSplatPath: true, v3_throwAbortReason: true, v3_lazyRouteDiscovery: true, + v3_singleFetch: true, }, }), UnoCSS(), From ce5b2563836a390b3d3a876c32c2fd090a711186 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:36:03 +1100 Subject: [PATCH 021/286] Add v3_singleFetch flag to vite-electron.config.ts --- vite-electron.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vite-electron.config.ts b/vite-electron.config.ts index 6a845cc9..84552d6f 100644 --- a/vite-electron.config.ts +++ b/vite-electron.config.ts @@ -46,6 +46,7 @@ export default defineConfig((config) => { v3_relativeSplatPath: true, v3_throwAbortReason: true, v3_lazyRouteDiscovery: true, + v3_singleFetch: true, }, serverModuleFormat: 'esm', }), From 61add878c75368ac5fbcd9c3bed8fb682844fc23 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:46:45 +1100 Subject: [PATCH 022/286] Revert v3_singleFetch flag from vite.config.ts --- vite.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/vite.config.ts b/vite.config.ts index 3790270b..62db5f4f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -125,7 +125,6 @@ export default defineConfig((config) => { v3_relativeSplatPath: true, v3_throwAbortReason: true, v3_lazyRouteDiscovery: true, - v3_singleFetch: true, }, }), UnoCSS(), From da1cb8dbc391c8d39996c2f773a6f6459497376b Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 22:47:17 +1100 Subject: [PATCH 023/286] Revert v3_singleFetch flag from vite-electron.config.ts --- vite-electron.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/vite-electron.config.ts b/vite-electron.config.ts index 84552d6f..6a845cc9 100644 --- a/vite-electron.config.ts +++ b/vite-electron.config.ts @@ -46,7 +46,6 @@ export default defineConfig((config) => { v3_relativeSplatPath: true, v3_throwAbortReason: true, v3_lazyRouteDiscovery: true, - v3_singleFetch: true, }, serverModuleFormat: 'esm', }), From 586447c64d67c09577670d8bb44488502c837ff4 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 13 Dec 2025 23:06:53 +1100 Subject: [PATCH 024/286] Replace Product Hunt header with Fazier badge --- app/components/header/Header.tsx | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/app/components/header/Header.tsx b/app/components/header/Header.tsx index b91af24f..f74ef9c5 100644 --- a/app/components/header/Header.tsx +++ b/app/components/header/Header.tsx @@ -31,19 +31,11 @@ export function Header() {
- + CodinIT.dev - The #1 local-first open source AI software engineer | Product Hunt
- + Fazier badge
- + Fazier badge
- Fazier badge - Fazier badge + Fazier badge + Fazier badge +
+ +
+
{alert.streamingOutput || alert.content}
+
+ + {alert.progress !== undefined && alert.progress >= 0 && ( +
+
+ Progress + + {Math.round(alert.progress)}% + +
+
+ +
+
+ )} + + + ); +}); + +LiveActionAlert.displayName = 'LiveActionAlert'; diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index 01b44975..5e7f6d1a 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -5,6 +5,7 @@ import { Chat } from '~/components/chat/Chat.client'; import { Header } from '~/components/header/Header'; import { ElectronTitleBar } from '~/components/ui/ElectronTitleBar'; import BackgroundRays from '~/components/ui/BackgroundRays'; +import { LiveActionAlert } from '~/components/chat/LiveActionAlert'; export const meta: MetaFunction = () => { return [ @@ -22,6 +23,7 @@ export default function Index() {
}>{() => } + {() => }
); } From fe92b19e8d62578b5fc229871ca3fa9446d9bbf2 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Tue, 16 Dec 2025 19:09:06 +1100 Subject: [PATCH 048/286] weekly rank 2 on fazier badge --- app/components/header/Header.tsx | 4 +-- public/hero.png | Bin 0 -> 530181 bytes public/rank-2-dark.svg | 48 +++++++++++++++++++++++++++++++ public/rank-2-light.svg | 48 +++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 public/hero.png create mode 100644 public/rank-2-dark.svg create mode 100644 public/rank-2-light.svg diff --git a/app/components/header/Header.tsx b/app/components/header/Header.tsx index 696ad126..313d22a4 100644 --- a/app/components/header/Header.tsx +++ b/app/components/header/Header.tsx @@ -32,8 +32,8 @@ export function Header() {
- Fazier badge - Fazier badge + Fazier badge + Fazier badge + +
+
+ + + ); +} From 84899a42021879b7eb64eb9d92ada2b94aa00645 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 18 Dec 2025 00:33:45 +1100 Subject: [PATCH 053/286] feat: integrate DiffApprovalDialog into main route --- app/routes/_index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index 5e7f6d1a..4ab332f5 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -6,6 +6,7 @@ import { Header } from '~/components/header/Header'; import { ElectronTitleBar } from '~/components/ui/ElectronTitleBar'; import BackgroundRays from '~/components/ui/BackgroundRays'; import { LiveActionAlert } from '~/components/chat/LiveActionAlert'; +import { DiffApprovalDialog } from '~/components/workbench/DiffApprovalDialog'; export const meta: MetaFunction = () => { return [ @@ -24,6 +25,7 @@ export default function Index() {
}>{() => } {() => } + {() => }
); } From 5577761e0b2224fd31f22b4d3c6a4c220dc266d5 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 18 Dec 2025 00:34:38 +1100 Subject: [PATCH 054/286] refactor: remove event logs and task manager tabs from ControlPanel --- app/components/@settings/core/ControlPanel.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/components/@settings/core/ControlPanel.tsx b/app/components/@settings/core/ControlPanel.tsx index 139ed8f7..b95d2559 100644 --- a/app/components/@settings/core/ControlPanel.tsx +++ b/app/components/@settings/core/ControlPanel.tsx @@ -33,13 +33,11 @@ import NotificationsTab from '~/components/@settings/tabs/notifications/Notifica import FeaturesTab from '~/components/@settings/tabs/features/FeaturesTab'; import { DataTab } from '~/components/@settings/tabs/data/DataTab'; import DebugTab from '~/components/@settings/tabs/debug/DebugTab'; -import { EventLogsTab } from '~/components/@settings/tabs/event-logs/EventLogsTab'; import UpdateTab from '~/components/@settings/tabs/update/UpdateTab'; import ConnectionsTab from '~/components/@settings/tabs/connections/ConnectionsTab'; import CloudProvidersTab from '~/components/@settings/tabs/providers/cloud/CloudProvidersTab'; import ServiceStatusTab from '~/components/@settings/tabs/providers/status/ServiceStatusTab'; import LocalProvidersTab from '~/components/@settings/tabs/providers/local/LocalProvidersTab'; -import TaskManagerTab from '~/components/@settings/tabs/task-manager/TaskManagerTab'; import ApiKeysTab from '~/components/@settings/tabs/api-keys/APIKeysTab'; interface ControlPanelProps { @@ -347,12 +345,8 @@ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => { return ; case 'debug': return ; - case 'event-logs': - return ; case 'update': return ; - case 'task-manager': - return ; case 'service-status': return ; default: From 2c1b6da2541c1890ce85c5907fefea7f6e4ac8ec Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 18 Dec 2025 00:34:45 +1100 Subject: [PATCH 055/286] refactor: remove unused event logs and task manager tab components --- .../tabs/event-logs/EventLogsTab.tsx | 1013 ----------- .../tabs/task-manager/TaskManagerTab.tsx | 1604 ----------------- 2 files changed, 2617 deletions(-) delete mode 100644 app/components/@settings/tabs/event-logs/EventLogsTab.tsx delete mode 100644 app/components/@settings/tabs/task-manager/TaskManagerTab.tsx diff --git a/app/components/@settings/tabs/event-logs/EventLogsTab.tsx b/app/components/@settings/tabs/event-logs/EventLogsTab.tsx deleted file mode 100644 index 391dcc6b..00000000 --- a/app/components/@settings/tabs/event-logs/EventLogsTab.tsx +++ /dev/null @@ -1,1013 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { motion } from 'framer-motion'; -import { Switch } from '~/components/ui/Switch'; -import { logStore, type LogEntry } from '~/lib/stores/logs'; -import { useStore } from '@nanostores/react'; -import { classNames } from '~/utils/classNames'; -import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; -import { Dialog, DialogRoot, DialogTitle } from '~/components/ui/Dialog'; -import { toast } from 'react-toastify'; - -interface SelectOption { - value: string; - label: string; - icon?: string; - color?: string; -} - -const logLevelOptions: SelectOption[] = [ - { - value: 'all', - label: 'All Types', - icon: 'i-ph:funnel', - color: '#9333ea', - }, - { - value: 'provider', - label: 'LLM', - icon: 'i-ph:robot', - color: '#10b981', - }, - { - value: 'api', - label: 'API', - icon: 'i-ph:cloud', - color: '#3b82f6', - }, - { - value: 'error', - label: 'Errors', - icon: 'i-ph:warning-circle', - color: '#ef4444', - }, - { - value: 'warning', - label: 'Warnings', - icon: 'i-ph:warning', - color: '#f59e0b', - }, - { - value: 'info', - label: 'Info', - icon: 'i-ph:info', - color: '#3b82f6', - }, - { - value: 'debug', - label: 'Debug', - icon: 'i-ph:bug', - color: '#6b7280', - }, -]; - -interface LogEntryItemProps { - log: LogEntry; - isExpanded: boolean; - use24Hour: boolean; - showTimestamp: boolean; -} - -const LogEntryItem = ({ log, isExpanded: forceExpanded, use24Hour, showTimestamp }: LogEntryItemProps) => { - const [localExpanded, setLocalExpanded] = useState(forceExpanded); - - useEffect(() => { - setLocalExpanded(forceExpanded); - }, [forceExpanded]); - - const timestamp = useMemo(() => { - const date = new Date(log.timestamp); - return date.toLocaleTimeString('en-US', { hour12: !use24Hour }); - }, [log.timestamp, use24Hour]); - - const style = useMemo(() => { - if (log.category === 'provider') { - return { - icon: 'i-ph:robot', - color: 'text-emerald-500 dark:text-emerald-400', - bg: 'hover:bg-emerald-500/10 dark:hover:bg-emerald-500/20', - badge: 'text-emerald-500 bg-emerald-50 dark:bg-emerald-500/10', - }; - } - - if (log.category === 'api') { - return { - icon: 'i-ph:cloud', - color: 'text-blue-500 dark:text-blue-400', - bg: 'hover:bg-blue-500/10 dark:hover:bg-blue-500/20', - badge: 'text-blue-500 bg-blue-50 dark:bg-blue-500/10', - }; - } - - switch (log.level) { - case 'error': - return { - icon: 'i-ph:warning-circle', - color: 'text-red-500 dark:text-red-400', - bg: 'hover:bg-red-500/10 dark:hover:bg-red-500/20', - badge: 'text-red-500 bg-red-50 dark:bg-red-500/10', - }; - case 'warning': - return { - icon: 'i-ph:warning', - color: 'text-yellow-500 dark:text-yellow-400', - bg: 'hover:bg-yellow-500/10 dark:hover:bg-yellow-500/20', - badge: 'text-yellow-500 bg-yellow-50 dark:bg-yellow-500/10', - }; - case 'debug': - return { - icon: 'i-ph:bug', - color: 'text-gray-500 dark:text-gray-400', - bg: 'hover:bg-gray-500/10 dark:hover:bg-gray-500/20', - badge: 'text-gray-500 bg-gray-50 dark:bg-gray-500/10', - }; - default: - return { - icon: 'i-ph:info', - color: 'text-blue-500 dark:text-blue-400', - bg: 'hover:bg-blue-500/10 dark:hover:bg-blue-500/20', - badge: 'text-blue-500 bg-blue-50 dark:bg-blue-500/10', - }; - } - }, [log.level, log.category]); - - const renderDetails = (details: any) => { - if (log.category === 'provider') { - return ( -
-
- Model: {details.model} - - Tokens: {details.totalTokens} - - Duration: {details.duration}ms -
- {details.prompt && ( -
-
Prompt:
-
-                {details.prompt}
-              
-
- )} - {details.response && ( -
-
Response:
-
-                {details.response}
-              
-
- )} -
- ); - } - - if (log.category === 'api') { - return ( -
-
- {details.method} - - Status: {details.statusCode} - - Duration: {details.duration}ms -
-
{details.url}
- {details.request && ( -
-
Request:
-
-                {JSON.stringify(details.request, null, 2)}
-              
-
- )} - {details.response && ( -
-
Response:
-
-                {JSON.stringify(details.response, null, 2)}
-              
-
- )} - {details.error && ( -
-
Error:
-
-                {JSON.stringify(details.error, null, 2)}
-              
-
- )} -
- ); - } - - return ( -
-        {JSON.stringify(details, null, 2)}
-      
- ); - }; - - return ( - -
-
- -
-
{log.message}
- {log.details && ( - <> - - {localExpanded && renderDetails(log.details)} - - )} -
-
- {log.level} -
- {log.category && ( -
- {log.category} -
- )} -
-
-
- {showTimestamp && } -
-
- ); -}; - -interface ExportFormat { - id: string; - label: string; - icon: string; - handler: () => void; -} - -export function EventLogsTab() { - const logs = useStore(logStore.logs); - const [selectedLevel, setSelectedLevel] = useState<'all' | string>('all'); - const [searchQuery, setSearchQuery] = useState(''); - const [use24Hour, setUse24Hour] = useState(false); - const [autoExpand, setAutoExpand] = useState(false); - const [showTimestamps, setShowTimestamps] = useState(true); - const [showLevelFilter, setShowLevelFilter] = useState(false); - const [isRefreshing, setIsRefreshing] = useState(false); - const levelFilterRef = useRef(null); - - const filteredLogs = useMemo(() => { - const allLogs = Object.values(logs); - const lowerSearchQuery = searchQuery.toLowerCase(); - const hasSearch = Boolean(searchQuery); - const isAllLevel = selectedLevel === 'all'; - - return allLogs.filter((log) => { - if (!isAllLevel && log.category !== selectedLevel && log.level !== selectedLevel) { - return false; - } - - if (hasSearch && !log.message.toLowerCase().includes(lowerSearchQuery)) { - return false; - } - - return true; - }); - }, [logs, selectedLevel, searchQuery]); - - // Add performance tracking on mount - useEffect(() => { - const startTime = performance.now(); - - logStore.logInfo('Event Logs tab mounted', { - type: 'component_mount', - message: 'Event Logs tab component mounted', - component: 'EventLogsTab', - }); - - return () => { - const duration = performance.now() - startTime; - logStore.logPerformanceMetric('EventLogsTab', 'mount-duration', duration); - }; - }, []); - - // Log filter changes - const handleLevelFilterChange = useCallback( - (newLevel: string) => { - logStore.logInfo('Log level filter changed', { - type: 'filter_change', - message: `Log level filter changed from ${selectedLevel} to ${newLevel}`, - component: 'EventLogsTab', - previousLevel: selectedLevel, - newLevel, - }); - setSelectedLevel(newLevel as string); - setShowLevelFilter(false); - }, - [selectedLevel], - ); - - // Log search changes with debounce - useEffect(() => { - const timeoutId = setTimeout(() => { - if (searchQuery) { - logStore.logInfo('Log search performed', { - type: 'search', - message: `Search performed with query "${searchQuery}" (${filteredLogs.length} results)`, - component: 'EventLogsTab', - query: searchQuery, - resultsCount: filteredLogs.length, - }); - } - }, 1000); - - return () => clearTimeout(timeoutId); - }, [searchQuery, filteredLogs.length]); - - // Enhanced refresh handler - const handleRefresh = useCallback(async () => { - const startTime = performance.now(); - setIsRefreshing(true); - - try { - await logStore.refreshLogs(); - - const duration = performance.now() - startTime; - - logStore.logSuccess('Logs refreshed successfully', { - type: 'refresh', - message: `Successfully refreshed ${Object.keys(logs).length} logs`, - component: 'EventLogsTab', - duration, - logsCount: Object.keys(logs).length, - }); - } catch (error) { - logStore.logError('Failed to refresh logs', error, { - type: 'refresh_error', - message: 'Failed to refresh logs', - component: 'EventLogsTab', - }); - } finally { - setTimeout(() => setIsRefreshing(false), 500); - } - }, [logs]); - - // Log preference changes - const handlePreferenceChange = useCallback((type: string, value: boolean) => { - logStore.logInfo('Log preference changed', { - type: 'preference_change', - message: `Log preference "${type}" changed to ${value}`, - component: 'EventLogsTab', - preference: type, - value, - }); - - switch (type) { - case 'timestamps': - setShowTimestamps(value); - break; - case '24hour': - setUse24Hour(value); - break; - case 'autoExpand': - setAutoExpand(value); - break; - } - }, []); - - // Close filters when clicking outside - useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { - if (levelFilterRef.current && !levelFilterRef.current.contains(event.target as Node)) { - setShowLevelFilter(false); - } - }; - - document.addEventListener('mousedown', handleClickOutside); - - return () => { - document.removeEventListener('mousedown', handleClickOutside); - }; - }, []); - - const selectedLevelOption = logLevelOptions.find((opt) => opt.value === selectedLevel); - - // Export functions - const exportAsJSON = () => { - try { - const exportData = { - timestamp: new Date().toISOString(), - logs: filteredLogs, - filters: { - level: selectedLevel, - searchQuery, - }, - preferences: { - use24Hour, - showTimestamps, - autoExpand, - }, - }; - - const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' }); - const url = window.URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = `codinit-event-logs-${new Date().toISOString()}.json`; - document.body.appendChild(a); - a.click(); - window.URL.revokeObjectURL(url); - document.body.removeChild(a); - toast.success('Event logs exported successfully as JSON'); - } catch (error) { - console.error('Failed to export JSON:', error); - toast.error('Failed to export event logs as JSON'); - } - }; - - const exportAsCSV = () => { - try { - // Convert logs to CSV format - const headers = ['Timestamp', 'Level', 'Category', 'Message', 'Details']; - const csvData = [ - headers, - ...filteredLogs.map((log) => [ - new Date(log.timestamp).toISOString(), - log.level, - log.category || '', - log.message, - log.details ? JSON.stringify(log.details) : '', - ]), - ]; - - const csvContent = csvData - .map((row) => row.map((cell) => `"${String(cell).replace(/"/g, '""')}"`).join(',')) - .join('\n'); - const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); - const url = window.URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = `codinit-event-logs-${new Date().toISOString()}.csv`; - document.body.appendChild(a); - a.click(); - window.URL.revokeObjectURL(url); - document.body.removeChild(a); - toast.success('Event logs exported successfully as CSV'); - } catch (error) { - console.error('Failed to export CSV:', error); - toast.error('Failed to export event logs as CSV'); - } - }; - - const exportAsPDF = async () => { - try { - const { jsPDF } = await import('jspdf'); - - // Create new PDF document - const doc = new jsPDF(); - const lineHeight = 7; - let yPos = 20; - const margin = 20; - const pageWidth = doc.internal.pageSize.getWidth(); - const maxLineWidth = pageWidth - 2 * margin; - - // Helper function to add section header - const addSectionHeader = (title: string) => { - // Check if we need a new page - if (yPos > doc.internal.pageSize.getHeight() - 30) { - doc.addPage(); - yPos = margin; - } - - doc.setFillColor('#F3F4F6'); - doc.rect(margin - 2, yPos - 5, pageWidth - 2 * (margin - 2), lineHeight + 6, 'F'); - doc.setFont('helvetica', 'bold'); - doc.setTextColor('#111827'); - doc.setFontSize(12); - doc.text(title.toUpperCase(), margin, yPos); - yPos += lineHeight * 2; - }; - - // Add title and header - doc.setFillColor('#6366F1'); - doc.rect(0, 0, pageWidth, 50, 'F'); - doc.setTextColor('#FFFFFF'); - doc.setFontSize(24); - doc.setFont('helvetica', 'bold'); - doc.text('Event Logs Report', margin, 35); - - // Add subtitle with codinit.dev - doc.setFontSize(12); - doc.setFont('helvetica', 'normal'); - doc.text('codinit.dev - AI Development Platform', margin, 45); - yPos = 70; - - // Add report summary section - addSectionHeader('Report Summary'); - - doc.setFontSize(10); - doc.setFont('helvetica', 'normal'); - doc.setTextColor('#374151'); - - const summaryItems = [ - { label: 'Generated', value: new Date().toLocaleString() }, - { label: 'Total Logs', value: filteredLogs.length.toString() }, - { label: 'Filter Applied', value: selectedLevel === 'all' ? 'All Types' : selectedLevel }, - { label: 'Search Query', value: searchQuery || 'None' }, - { label: 'Time Format', value: use24Hour ? '24-hour' : '12-hour' }, - ]; - - summaryItems.forEach((item) => { - doc.setFont('helvetica', 'bold'); - doc.text(`${item.label}:`, margin, yPos); - doc.setFont('helvetica', 'normal'); - doc.text(item.value, margin + 60, yPos); - yPos += lineHeight; - }); - - yPos += lineHeight * 2; - - // Add statistics section - addSectionHeader('Log Statistics'); - - // Calculate statistics - const stats = { - error: filteredLogs.filter((log) => log.level === 'error').length, - warning: filteredLogs.filter((log) => log.level === 'warning').length, - info: filteredLogs.filter((log) => log.level === 'info').length, - debug: filteredLogs.filter((log) => log.level === 'debug').length, - provider: filteredLogs.filter((log) => log.category === 'provider').length, - api: filteredLogs.filter((log) => log.category === 'api').length, - }; - - // Create two columns for statistics - const leftStats = [ - { label: 'Error Logs', value: stats.error, color: '#DC2626' }, - { label: 'Warning Logs', value: stats.warning, color: '#F59E0B' }, - { label: 'Info Logs', value: stats.info, color: '#3B82F6' }, - ]; - - const rightStats = [ - { label: 'Debug Logs', value: stats.debug, color: '#6B7280' }, - { label: 'LLM Logs', value: stats.provider, color: '#10B981' }, - { label: 'API Logs', value: stats.api, color: '#3B82F6' }, - ]; - - const colWidth = (pageWidth - 2 * margin) / 2; - - // Draw statistics in two columns - leftStats.forEach((stat, index) => { - doc.setTextColor(stat.color); - doc.setFont('helvetica', 'bold'); - doc.text(stat.value.toString(), margin, yPos); - doc.setTextColor('#374151'); - doc.setFont('helvetica', 'normal'); - doc.text(stat.label, margin + 20, yPos); - - if (rightStats[index]) { - doc.setTextColor(rightStats[index].color); - doc.setFont('helvetica', 'bold'); - doc.text(rightStats[index].value.toString(), margin + colWidth, yPos); - doc.setTextColor('#374151'); - doc.setFont('helvetica', 'normal'); - doc.text(rightStats[index].label, margin + colWidth + 20, yPos); - } - - yPos += lineHeight; - }); - - yPos += lineHeight * 2; - - // Add logs section - addSectionHeader('Event Logs'); - - // Helper function to add a log entry with improved formatting - const addLogEntry = (log: LogEntry) => { - const entryHeight = 20 + (log.details ? 40 : 0); // Estimate entry height - - // Check if we need a new page - if (yPos + entryHeight > doc.internal.pageSize.getHeight() - 20) { - doc.addPage(); - yPos = margin; - } - - // Add timestamp and level - const timestamp = new Date(log.timestamp).toLocaleString(undefined, { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - hour12: !use24Hour, - }); - - // Draw log level badge background - const levelColors: Record = { - error: '#FEE2E2', - warning: '#FEF3C7', - info: '#DBEAFE', - debug: '#F3F4F6', - }; - - const textColors: Record = { - error: '#DC2626', - warning: '#F59E0B', - info: '#3B82F6', - debug: '#6B7280', - }; - - const levelWidth = doc.getTextWidth(log.level.toUpperCase()) + 10; - doc.setFillColor(levelColors[log.level] || '#F3F4F6'); - doc.roundedRect(margin, yPos - 4, levelWidth, lineHeight + 4, 1, 1, 'F'); - - // Add log level text - doc.setTextColor(textColors[log.level] || '#6B7280'); - doc.setFont('helvetica', 'bold'); - doc.setFontSize(8); - doc.text(log.level.toUpperCase(), margin + 5, yPos); - - // Add timestamp - doc.setTextColor('#6B7280'); - doc.setFont('helvetica', 'normal'); - doc.setFontSize(9); - doc.text(timestamp, margin + levelWidth + 10, yPos); - - // Add category if present - if (log.category) { - const categoryX = margin + levelWidth + doc.getTextWidth(timestamp) + 20; - doc.setFillColor('#F3F4F6'); - - const categoryWidth = doc.getTextWidth(log.category) + 10; - doc.roundedRect(categoryX, yPos - 4, categoryWidth, lineHeight + 4, 2, 2, 'F'); - doc.setTextColor('#6B7280'); - doc.text(log.category, categoryX + 5, yPos); - } - - yPos += lineHeight * 1.5; - - // Add message - doc.setTextColor('#111827'); - doc.setFontSize(10); - - const messageLines = doc.splitTextToSize(log.message, maxLineWidth - 10); - doc.text(messageLines, margin + 5, yPos); - yPos += messageLines.length * lineHeight; - - // Add details if present - if (log.details) { - doc.setTextColor('#6B7280'); - doc.setFontSize(8); - - const detailsStr = JSON.stringify(log.details, null, 2); - const detailsLines = doc.splitTextToSize(detailsStr, maxLineWidth - 15); - - // Add details background - doc.setFillColor('#F9FAFB'); - doc.roundedRect(margin + 5, yPos - 2, maxLineWidth - 10, detailsLines.length * lineHeight + 8, 1, 1, 'F'); - - doc.text(detailsLines, margin + 10, yPos + 4); - yPos += detailsLines.length * lineHeight + 10; - } - - // Add separator line - doc.setDrawColor('#E5E7EB'); - doc.setLineWidth(0.1); - doc.line(margin, yPos, pageWidth - margin, yPos); - yPos += lineHeight * 1.5; - }; - - // Add all logs - filteredLogs.forEach((log) => { - addLogEntry(log); - }); - - // Add footer to all pages - const totalPages = doc.internal.pages.length - 1; - - for (let i = 1; i <= totalPages; i++) { - doc.setPage(i); - doc.setFontSize(8); - doc.setTextColor('#9CA3AF'); - - // Add page numbers - doc.text(`Page ${i} of ${totalPages}`, pageWidth / 2, doc.internal.pageSize.getHeight() - 10, { - align: 'center', - }); - - // Add footer text - doc.text('Generated by codinit.dev', margin, doc.internal.pageSize.getHeight() - 10); - - const dateStr = new Date().toLocaleDateString(); - doc.text(dateStr, pageWidth - margin, doc.internal.pageSize.getHeight() - 10, { align: 'right' }); - } - - // Save the PDF - doc.save(`codinit-event-logs-${new Date().toISOString()}.pdf`); - toast.success('Event logs exported successfully as PDF'); - } catch (error) { - console.error('Failed to export PDF:', error); - toast.error('Failed to export event logs as PDF'); - } - }; - - const exportAsText = () => { - try { - const textContent = filteredLogs - .map((log) => { - const timestamp = new Date(log.timestamp).toLocaleString(); - let content = `[${timestamp}] ${log.level.toUpperCase()}: ${log.message}\n`; - - if (log.category) { - content += `Category: ${log.category}\n`; - } - - if (log.details) { - content += `Details:\n${JSON.stringify(log.details, null, 2)}\n`; - } - - return content + '-'.repeat(80) + '\n'; - }) - .join('\n'); - - const blob = new Blob([textContent], { type: 'text/plain' }); - const url = window.URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = `codinit-event-logs-${new Date().toISOString()}.txt`; - document.body.appendChild(a); - a.click(); - window.URL.revokeObjectURL(url); - document.body.removeChild(a); - toast.success('Event logs exported successfully as text file'); - } catch (error) { - console.error('Failed to export text file:', error); - toast.error('Failed to export event logs as text file'); - } - }; - - const exportFormats: ExportFormat[] = [ - { - id: 'json', - label: 'Export as JSON', - icon: 'i-ph:file-js', - handler: exportAsJSON, - }, - { - id: 'csv', - label: 'Export as CSV', - icon: 'i-ph:file-csv', - handler: exportAsCSV, - }, - { - id: 'pdf', - label: 'Export as PDF', - icon: 'i-ph:file-pdf', - handler: exportAsPDF, - }, - { - id: 'txt', - label: 'Export as Text', - icon: 'i-ph:file-text', - handler: exportAsText, - }, - ]; - - const ExportButton = () => { - const [isOpen, setIsOpen] = useState(false); - - const handleOpenChange = useCallback((open: boolean) => { - setIsOpen(open); - }, []); - - const handleFormatClick = useCallback((handler: () => void) => { - handler(); - setIsOpen(false); - }, []); - - return ( - - - - -
- -
- Export Event Logs - - -
- {exportFormats.map((format) => ( - - ))} -
-
-
-
- ); - }; - - return ( -
-
- - - - - - - - {logLevelOptions.map((option) => ( - handleLevelFilterChange(option.value)} - > -
-
-
- {option.label} - - ))} - - - - -
-
- handlePreferenceChange('timestamps', value)} - className="data-[state=checked]:bg-blue-500" - /> - Show Timestamps -
- -
- handlePreferenceChange('24hour', value)} - className="data-[state=checked]:bg-blue-500" - /> - 24h Time -
- -
- handlePreferenceChange('autoExpand', value)} - className="data-[state=checked]:bg-blue-500" - /> - Auto Expand -
- -
- - - - -
-
- -
-
- setSearchQuery(e.target.value)} - className={classNames( - 'w-full px-4 py-2 pl-10 rounded-lg', - 'bg-[#FAFAFA] dark:bg-[#0A0A0A]', - 'border border-[#E5E5E5] dark:border-[#1A1A1A]', - 'text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400', - 'focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500', - 'transition-all duration-200', - )} - /> -
-
-
-
- - {filteredLogs.length === 0 ? ( - - -
-

No Logs Found

-

Try adjusting your search or filters

-
-
- ) : ( - filteredLogs.map((log) => ( - - )) - )} -
-
- ); -} diff --git a/app/components/@settings/tabs/task-manager/TaskManagerTab.tsx b/app/components/@settings/tabs/task-manager/TaskManagerTab.tsx deleted file mode 100644 index e753bd15..00000000 --- a/app/components/@settings/tabs/task-manager/TaskManagerTab.tsx +++ /dev/null @@ -1,1604 +0,0 @@ -import * as React from 'react'; -import { useEffect, useState, useCallback } from 'react'; -import { classNames } from '~/utils/classNames'; -import { Line } from 'react-chartjs-2'; -import { - Chart as ChartJS, - CategoryScale, - LinearScale, - PointElement, - LineElement, - Title, - Tooltip, - Legend, - type Chart, -} from 'chart.js'; -import { toast } from 'react-toastify'; // Import toast -import { useUpdateCheck } from '~/lib/hooks/useUpdateCheck'; -import { tabConfigurationStore, type TabConfig } from '~/lib/stores/tabConfigurationStore'; -import { useStore } from 'zustand'; - -// Register ChartJS components -ChartJS.register(CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend); - -interface BatteryManager extends EventTarget { - charging: boolean; - chargingTime: number; - dischargingTime: number; - level: number; -} - -interface SystemMemoryInfo { - total: number; - free: number; - used: number; - percentage: number; - swap?: { - total: number; - free: number; - used: number; - percentage: number; - }; - timestamp: string; - error?: string; -} - -interface ProcessInfo { - pid: number; - name: string; - cpu: number; - memory: number; - command?: string; - timestamp: string; - error?: string; -} - -interface DiskInfo { - filesystem: string; - size: number; - used: number; - available: number; - percentage: number; - mountpoint: string; - timestamp: string; - error?: string; -} - -interface SystemMetrics { - memory: { - used: number; - total: number; - percentage: number; - process?: { - heapUsed: number; - heapTotal: number; - external: number; - rss: number; - }; - }; - systemMemory?: SystemMemoryInfo; - processes?: ProcessInfo[]; - disks?: DiskInfo[]; - battery?: { - level: number; - charging: boolean; - timeRemaining?: number; - }; - network: { - downlink: number; - uplink?: number; - latency: { - current: number; - average: number; - min: number; - max: number; - history: number[]; - lastUpdate: number; - }; - type: string; - effectiveType?: string; - }; - performance: { - pageLoad: number; - domReady: number; - resources: { - total: number; - size: number; - loadTime: number; - }; - timing: { - ttfb: number; - fcp: number; - lcp: number; - }; - }; -} - -type SortField = 'name' | 'pid' | 'cpu' | 'memory'; -type SortDirection = 'asc' | 'desc'; - -interface MetricsHistory { - timestamps: string[]; - memory: number[]; - battery: number[]; - network: number[]; - cpu: number[]; - disk: number[]; -} - -interface PerformanceAlert { - type: 'warning' | 'error' | 'info'; - message: string; - timestamp: number; - metric: string; - threshold: number; - value: number; -} - -declare global { - interface Navigator { - getBattery(): Promise; - } - interface Performance { - memory?: { - jsHeapSizeLimit: number; - totalJSHeapSize: number; - usedJSHeapSize: number; - }; - } -} - -// Constants for performance thresholds -const PERFORMANCE_THRESHOLDS = { - memory: { - warning: 75, - critical: 90, - }, - network: { - latency: { - warning: 200, - critical: 500, - }, - }, - battery: { - warning: 20, - critical: 10, - }, -}; - -// Default metrics state -const DEFAULT_METRICS_STATE: SystemMetrics = { - memory: { - used: 0, - total: 0, - percentage: 0, - }, - network: { - downlink: 0, - latency: { - current: 0, - average: 0, - min: 0, - max: 0, - history: [], - lastUpdate: 0, - }, - type: 'unknown', - }, - performance: { - pageLoad: 0, - domReady: 0, - resources: { - total: 0, - size: 0, - loadTime: 0, - }, - timing: { - ttfb: 0, - fcp: 0, - lcp: 0, - }, - }, -}; - -// Default metrics history -const DEFAULT_METRICS_HISTORY: MetricsHistory = { - timestamps: Array(8).fill(new Date().toLocaleTimeString()), - memory: Array(8).fill(0), - battery: Array(8).fill(0), - network: Array(8).fill(0), - cpu: Array(8).fill(0), - disk: Array(8).fill(0), -}; - -// Maximum number of history points to keep -const MAX_HISTORY_POINTS = 8; - -// Used for environment detection in updateMetrics function -const isLocalDevelopment = - typeof window !== 'undefined' && - window.location && - (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'); - -// For development environments, we'll always provide mock data if real data isn't available -const isDevelopment = - typeof window !== 'undefined' && - (window.location.hostname === 'localhost' || - window.location.hostname === '127.0.0.1' || - window.location.hostname.includes('192.168.') || - window.location.hostname.includes('.local')); - -// Function to detect Cloudflare and similar serverless environments where TaskManager is not useful -const isServerlessHosting = (): boolean => { - if (typeof window === 'undefined') { - return false; - } - - // For testing: Allow forcing serverless mode via URL param for easy testing - if (typeof window !== 'undefined' && window.location.search.includes('simulate-serverless=true')) { - console.log('Simulating serverless environment for testing'); - return true; - } - - // Check for common serverless hosting domains - const hostname = window.location.hostname; - - return ( - hostname.includes('.cloudflare.') || - hostname.includes('.netlify.app') || - hostname.includes('.vercel.app') || - hostname.endsWith('.workers.dev') - ); -}; - -const TaskManagerTab: React.FC = () => { - const [metrics, setMetrics] = useState(() => DEFAULT_METRICS_STATE); - const [metricsHistory, setMetricsHistory] = useState(() => DEFAULT_METRICS_HISTORY); - const [alerts, setAlerts] = useState([]); - const [lastAlertState, setLastAlertState] = useState('normal'); - const [sortField, setSortField] = useState('memory'); - const [sortDirection, setSortDirection] = useState('desc'); - const [isNotSupported, setIsNotSupported] = useState(false); - - // Chart refs for cleanup - const memoryChartRef = React.useRef | null>(null); - const batteryChartRef = React.useRef | null>(null); - const networkChartRef = React.useRef | null>(null); - const cpuChartRef = React.useRef | null>(null); - const diskChartRef = React.useRef | null>(null); - - // Cleanup chart instances on unmount - React.useEffect(() => { - const cleanupCharts = () => { - if (memoryChartRef.current) { - memoryChartRef.current.destroy(); - } - - if (batteryChartRef.current) { - batteryChartRef.current.destroy(); - } - - if (networkChartRef.current) { - networkChartRef.current.destroy(); - } - - if (cpuChartRef.current) { - cpuChartRef.current.destroy(); - } - - if (diskChartRef.current) { - diskChartRef.current.destroy(); - } - }; - - return cleanupCharts; - }, []); - - // Get update status and tab configuration - const { hasUpdate } = useUpdateCheck(); - const tabConfig = useStore(tabConfigurationStore); - - const resetTabConfiguration = useCallback(() => { - tabConfig.reset(); - return tabConfig.get(); - }, [tabConfig]); - - // Effect to handle tab visibility - useEffect(() => { - const handleTabVisibility = () => { - const currentConfig = tabConfig.get(); - const controlledTabs = ['debug', 'update']; - - // Update visibility based on conditions - const updatedTabs = currentConfig.userTabs.map((tab: TabConfig) => { - if (controlledTabs.includes(tab.id)) { - return { - ...tab, - visible: tab.id === 'debug' ? metrics.memory.percentage > 80 : hasUpdate, - }; - } - - return tab; - }); - - tabConfig.set({ - ...currentConfig, - userTabs: updatedTabs, - }); - }; - - const checkInterval = setInterval(handleTabVisibility, 5000); - - return () => { - clearInterval(checkInterval); - }; - }, [metrics.memory.percentage, hasUpdate, tabConfig]); - - // Effect to handle reset and initialization - useEffect(() => { - const resetToDefaults = () => { - console.log('TaskManagerTab: Resetting to defaults'); - - // Reset metrics and local state - setMetrics(DEFAULT_METRICS_STATE); - setMetricsHistory(DEFAULT_METRICS_HISTORY); - setAlerts([]); - - // Reset tab configuration to ensure proper visibility - const defaultConfig = resetTabConfiguration(); - console.log('TaskManagerTab: Reset tab configuration:', defaultConfig); - }; - - // Listen for both storage changes and custom reset event - const handleReset = (event: Event | StorageEvent) => { - if (event instanceof StorageEvent) { - if (event.key === 'tabConfiguration' && event.newValue === null) { - resetToDefaults(); - } - } else if (event instanceof CustomEvent && event.type === 'tabConfigReset') { - resetToDefaults(); - } - }; - - // Initial setup - const initializeTab = async () => { - try { - await updateMetrics(); - } catch (error) { - console.error('Failed to initialize TaskManagerTab:', error); - resetToDefaults(); - } - }; - - window.addEventListener('storage', handleReset); - window.addEventListener('tabConfigReset', handleReset); - initializeTab(); - - return () => { - window.removeEventListener('storage', handleReset); - window.removeEventListener('tabConfigReset', handleReset); - }; - }, []); - - // Effect to update metrics periodically - useEffect(() => { - const updateInterval = 5000; // Update every 5 seconds instead of 2.5 seconds - let metricsInterval: NodeJS.Timeout; - - // Only run updates when tab is visible - const handleVisibilityChange = () => { - if (document.hidden) { - clearInterval(metricsInterval); - } else { - updateMetrics(); - metricsInterval = setInterval(updateMetrics, updateInterval); - } - }; - - // Initial setup - handleVisibilityChange(); - document.addEventListener('visibilitychange', handleVisibilityChange); - - return () => { - clearInterval(metricsInterval); - document.removeEventListener('visibilitychange', handleVisibilityChange); - }; - }, []); - - // Effect to disable taskmanager on serverless environments - useEffect(() => { - const checkEnvironment = async () => { - // If we're on Cloudflare/Netlify/etc., set not supported - if (isServerlessHosting()) { - setIsNotSupported(true); - return; - } - - // For testing: Allow forcing API failures via URL param - if (typeof window !== 'undefined' && window.location.search.includes('simulate-api-failure=true')) { - console.log('Simulating API failures for testing'); - setIsNotSupported(true); - - return; - } - - // Try to fetch system metrics once as detection - try { - const response = await fetch('/api/system/memory-info'); - const diskResponse = await fetch('/api/system/disk-info'); - const processResponse = await fetch('/api/system/process-info'); - - // If all these return errors or not found, system monitoring is not supported - if (!response.ok && !diskResponse.ok && !processResponse.ok) { - setIsNotSupported(true); - } - } catch (error) { - console.warn('Failed to fetch system metrics. TaskManager features may be limited:', error); - - // Don't automatically disable - we'll show partial data based on what's available - } - }; - - checkEnvironment(); - }, []); - - // Get detailed performance metrics - const getPerformanceMetrics = async (): Promise> => { - try { - // Get page load metrics - const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming; - const pageLoad = navigation.loadEventEnd - navigation.startTime; - const domReady = navigation.domContentLoadedEventEnd - navigation.startTime; - - // Get resource metrics - const resources = performance.getEntriesByType('resource') as PerformanceResourceTiming[]; - const resourceMetrics = { - total: resources.length, - size: resources.reduce((total, r) => total + (r.transferSize || 0), 0), - loadTime: Math.max(0, ...resources.map((r) => r.duration)), - }; - - // Get Web Vitals - const ttfb = navigation.responseStart - navigation.requestStart; - const paintEntries = performance.getEntriesByType('paint'); - const fcp = paintEntries.find((entry) => entry.name === 'first-contentful-paint')?.startTime || 0; - - // Get LCP using PerformanceObserver - const lcp = await new Promise((resolve) => { - new PerformanceObserver((list) => { - const entries = list.getEntries(); - const lastEntry = entries[entries.length - 1]; - resolve(lastEntry?.startTime || 0); - }).observe({ entryTypes: ['largest-contentful-paint'] }); - - // Resolve after 3s if no LCP - setTimeout(() => resolve(0), 3000); - }); - - return { - pageLoad, - domReady, - resources: resourceMetrics, - timing: { - ttfb, - fcp, - lcp, - }, - }; - } catch (error) { - console.error('Failed to get performance metrics:', error); - return {}; - } - }; - - // Function to measure endpoint latency - const measureLatency = async (): Promise => { - try { - const headers = new Headers(); - headers.append('Cache-Control', 'no-cache, no-store, must-revalidate'); - headers.append('Pragma', 'no-cache'); - headers.append('Expires', '0'); - - const attemptMeasurement = async (): Promise => { - const start = performance.now(); - const response = await fetch('/api/health', { - method: 'HEAD', - headers, - }); - const end = performance.now(); - - if (!response.ok) { - throw new Error(`Health check failed with status: ${response.status}`); - } - - return Math.round(end - start); - }; - - try { - const latency = await attemptMeasurement(); - console.log(`Measured latency: ${latency}ms`); - - return latency; - } catch (error) { - console.warn(`Latency measurement failed, retrying: ${error}`); - - try { - // Retry once - const latency = await attemptMeasurement(); - console.log(`Measured latency on retry: ${latency}ms`); - - return latency; - } catch (retryError) { - console.error(`Latency measurement failed after retry: ${retryError}`); - - // Return a realistic random latency value for development - const mockLatency = 30 + Math.floor(Math.random() * 120); // 30-150ms - console.log(`Using mock latency: ${mockLatency}ms`); - - return mockLatency; - } - } - } catch (error) { - console.error(`Error in latency measurement: ${error}`); - - // Return a realistic random latency value - const mockLatency = 30 + Math.floor(Math.random() * 120); // 30-150ms - console.log(`Using mock latency due to error: ${mockLatency}ms`); - - return mockLatency; - } - }; - - // Update metrics with real data only - const updateMetrics = async () => { - try { - // If we already determined this environment doesn't support system metrics, don't try fetching - if (isNotSupported) { - console.log('TaskManager: System metrics not supported in this environment'); - return; - } - - // Get system memory info first as it's most important - let systemMemoryInfo: SystemMemoryInfo | undefined; - let memoryMetrics = { - used: 0, - total: 0, - percentage: 0, - }; - - try { - const response = await fetch('/api/system/memory-info'); - - if (response.ok) { - systemMemoryInfo = await response.json(); - console.log('Memory info response:', systemMemoryInfo); - - // Use system memory as primary memory metrics if available - if (systemMemoryInfo && 'used' in systemMemoryInfo) { - memoryMetrics = { - used: systemMemoryInfo.used || 0, - total: systemMemoryInfo.total || 1, - percentage: systemMemoryInfo.percentage || 0, - }; - } - } - } catch (error) { - console.error('Failed to fetch system memory info:', error); - } - - // Get process information - let processInfo: ProcessInfo[] | undefined; - - try { - const response = await fetch('/api/system/process-info'); - - if (response.ok) { - processInfo = await response.json(); - console.log('Process info response:', processInfo); - } - } catch (error) { - console.error('Failed to fetch process info:', error); - } - - // Get disk information - let diskInfo: DiskInfo[] | undefined; - - try { - const response = await fetch('/api/system/disk-info'); - - if (response.ok) { - diskInfo = await response.json(); - console.log('Disk info response:', diskInfo); - } - } catch (error) { - console.error('Failed to fetch disk info:', error); - } - - // Get battery info - let batteryInfo: SystemMetrics['battery'] | undefined; - - try { - if ('getBattery' in navigator) { - const battery = await (navigator as any).getBattery(); - batteryInfo = { - level: battery.level * 100, - charging: battery.charging, - timeRemaining: battery.charging ? battery.chargingTime : battery.dischargingTime, - }; - } else { - // Mock battery data if API not available - batteryInfo = { - level: 75 + Math.floor(Math.random() * 20), - charging: Math.random() > 0.3, - timeRemaining: 7200 + Math.floor(Math.random() * 3600), - }; - console.log('Battery API not available, using mock data'); - } - } catch (error) { - console.log('Battery API error, using mock data:', error); - batteryInfo = { - level: 75 + Math.floor(Math.random() * 20), - charging: Math.random() > 0.3, - timeRemaining: 7200 + Math.floor(Math.random() * 3600), - }; - } - - // Enhanced network metrics - const connection = - (navigator as any).connection || (navigator as any).mozConnection || (navigator as any).webkitConnection; - - // Measure real latency - const measuredLatency = await measureLatency(); - const connectionRtt = connection?.rtt || 0; - - // Use measured latency if available, fall back to connection.rtt - const currentLatency = measuredLatency || connectionRtt || Math.floor(Math.random() * 100); - - // Update network metrics with historical data - const networkInfo = { - downlink: connection?.downlink || 1.5 + Math.random(), - uplink: connection?.uplink || 0.5 + Math.random(), - latency: { - current: currentLatency, - average: - metrics.network.latency.history.length > 0 - ? [...metrics.network.latency.history, currentLatency].reduce((a, b) => a + b, 0) / - (metrics.network.latency.history.length + 1) - : currentLatency, - min: - metrics.network.latency.history.length > 0 - ? Math.min(...metrics.network.latency.history, currentLatency) - : currentLatency, - max: - metrics.network.latency.history.length > 0 - ? Math.max(...metrics.network.latency.history, currentLatency) - : currentLatency, - history: [...metrics.network.latency.history, currentLatency].slice(-30), // Keep last 30 measurements - lastUpdate: Date.now(), - }, - type: connection?.type || 'unknown', - effectiveType: connection?.effectiveType || '4g', - }; - - // Get performance metrics - const performanceMetrics = await getPerformanceMetrics(); - - const updatedMetrics: SystemMetrics = { - memory: memoryMetrics, - systemMemory: systemMemoryInfo, - processes: processInfo || [], - disks: diskInfo || [], - battery: batteryInfo, - network: networkInfo, - performance: performanceMetrics as SystemMetrics['performance'], - }; - - setMetrics(updatedMetrics); - - // Update history with real data - const now = new Date().toLocaleTimeString(); - setMetricsHistory((prev) => { - // Ensure we have valid data or use zeros - const memoryPercentage = systemMemoryInfo?.percentage || 0; - const batteryLevel = batteryInfo?.level || 0; - const networkDownlink = networkInfo.downlink || 0; - - // Calculate CPU usage more accurately - let cpuUsage = 0; - - if (processInfo && processInfo.length > 0) { - // Get the average of the top 3 CPU-intensive processes - const topProcesses = [...processInfo].sort((a, b) => b.cpu - a.cpu).slice(0, 3); - const topCpuUsage = topProcesses.reduce((total, proc) => total + proc.cpu, 0); - - // Get the sum of all processes - const totalCpuUsage = processInfo.reduce((total, proc) => total + proc.cpu, 0); - - // Use the higher of the two values, but cap at 100% - cpuUsage = Math.min(Math.max(topCpuUsage, (totalCpuUsage / processInfo.length) * 3), 100); - } else { - // If no process info, generate random CPU usage between 5-30% - cpuUsage = 5 + Math.floor(Math.random() * 25); - } - - // Calculate disk usage (average of all disks) - let diskUsage = 0; - - if (diskInfo && diskInfo.length > 0) { - diskUsage = diskInfo.reduce((total, disk) => total + disk.percentage, 0) / diskInfo.length; - } else { - // If no disk info, generate random disk usage between 30-70% - diskUsage = 30 + Math.floor(Math.random() * 40); - } - - // Create new arrays with the latest data - const timestamps = [...prev.timestamps, now].slice(-MAX_HISTORY_POINTS); - const memory = [...prev.memory, memoryPercentage].slice(-MAX_HISTORY_POINTS); - const battery = [...prev.battery, batteryLevel].slice(-MAX_HISTORY_POINTS); - const network = [...prev.network, networkDownlink].slice(-MAX_HISTORY_POINTS); - const cpu = [...prev.cpu, cpuUsage].slice(-MAX_HISTORY_POINTS); - const disk = [...prev.disk, diskUsage].slice(-MAX_HISTORY_POINTS); - - console.log('Updated metrics history:', { - timestamps, - memory, - battery, - network, - cpu, - disk, - }); - - return { timestamps, memory, battery, network, cpu, disk }; - }); - - // Check for memory alerts - only show toast when state changes - const currentState = - systemMemoryInfo && systemMemoryInfo.percentage > PERFORMANCE_THRESHOLDS.memory.critical - ? 'critical-memory' - : networkInfo.latency.current > PERFORMANCE_THRESHOLDS.network.latency.critical - ? 'critical-network' - : batteryInfo && !batteryInfo.charging && batteryInfo.level < PERFORMANCE_THRESHOLDS.battery.critical - ? 'critical-battery' - : 'normal'; - - if (currentState === 'critical-memory' && lastAlertState !== 'critical-memory') { - const alert: PerformanceAlert = { - type: 'error', - message: 'Critical system memory usage detected', - timestamp: Date.now(), - metric: 'memory', - threshold: PERFORMANCE_THRESHOLDS.memory.critical, - value: systemMemoryInfo?.percentage || 0, - }; - setAlerts((prev) => { - const newAlerts = [...prev, alert]; - return newAlerts.slice(-10); - }); - toast.warning(alert.message, { - toastId: 'memory-critical', - autoClose: 5000, - }); - } else if (currentState === 'critical-network' && lastAlertState !== 'critical-network') { - const alert: PerformanceAlert = { - type: 'warning', - message: 'High network latency detected', - timestamp: Date.now(), - metric: 'network', - threshold: PERFORMANCE_THRESHOLDS.network.latency.critical, - value: networkInfo.latency.current, - }; - setAlerts((prev) => { - const newAlerts = [...prev, alert]; - return newAlerts.slice(-10); - }); - toast.warning(alert.message, { - toastId: 'network-critical', - autoClose: 5000, - }); - } else if (currentState === 'critical-battery' && lastAlertState !== 'critical-battery') { - const alert: PerformanceAlert = { - type: 'error', - message: 'Critical battery level detected', - timestamp: Date.now(), - metric: 'battery', - threshold: PERFORMANCE_THRESHOLDS.battery.critical, - value: batteryInfo?.level || 0, - }; - setAlerts((prev) => { - const newAlerts = [...prev, alert]; - return newAlerts.slice(-10); - }); - toast.error(alert.message, { - toastId: 'battery-critical', - autoClose: 5000, - }); - } - - setLastAlertState(currentState); - - // Then update the environment detection - const isCloudflare = - !isDevelopment && // Not in development mode - ((systemMemoryInfo?.error && systemMemoryInfo.error.includes('not available')) || - (processInfo?.[0]?.error && processInfo[0].error.includes('not available')) || - (diskInfo?.[0]?.error && diskInfo[0].error.includes('not available'))); - - // If we detect that we're in a serverless environment, set the flag - if (isCloudflare || isServerlessHosting()) { - setIsNotSupported(true); - } - - if (isCloudflare) { - console.log('Running in Cloudflare environment. System metrics not available.'); - } else if (isLocalDevelopment) { - console.log('Running in local development environment. Using real or mock system metrics as available.'); - } else if (isDevelopment) { - console.log('Running in development environment. Using real or mock system metrics as available.'); - } else { - console.log('Running in production environment. Using real system metrics.'); - } - } catch (error) { - console.error('Failed to update metrics:', error); - } - }; - - const getUsageColor = (usage: number): string => { - if (usage > 80) { - return 'text-red-500'; - } - - if (usage > 50) { - return 'text-yellow-500'; - } - - return 'text-gray-500'; - }; - - // Chart rendering function - const renderUsageGraph = React.useMemo( - () => - (data: number[], label: string, color: string, chartRef: React.RefObject>) => { - // Ensure we have valid data - const validData = data.map((value) => (isNaN(value) ? 0 : value)); - - // Ensure we have at least 2 data points - if (validData.length < 2) { - // Add a second point if we only have one - if (validData.length === 1) { - validData.push(validData[0]); - } else { - // Add two points if we have none - validData.push(0, 0); - } - } - - const chartData = { - labels: - metricsHistory.timestamps.length > 0 - ? metricsHistory.timestamps - : Array(validData.length) - .fill('') - .map((_, _i) => new Date().toLocaleTimeString()), - datasets: [ - { - label, - data: validData.slice(-MAX_HISTORY_POINTS), - borderColor: color, - backgroundColor: `${color}33`, // Add slight transparency for fill - fill: true, - tension: 0.4, - pointRadius: 2, // Small points for better UX - borderWidth: 2, - }, - ], - }; - - const options = { - responsive: true, - maintainAspectRatio: false, - scales: { - y: { - beginAtZero: true, - max: label === 'Network' ? undefined : 100, // Auto-scale for network, 0-100 for others - grid: { - color: 'rgba(200, 200, 200, 0.1)', - drawBorder: false, - }, - ticks: { - maxTicksLimit: 5, - callback: (value: any) => { - if (label === 'Network') { - return `${value} Mbps`; - } - - return `${value}%`; - }, - }, - }, - x: { - grid: { - display: false, - }, - ticks: { - maxTicksLimit: 4, - maxRotation: 0, - }, - }, - }, - plugins: { - legend: { - display: false, - }, - tooltip: { - enabled: true, - mode: 'index' as const, - intersect: false, - backgroundColor: 'rgba(0, 0, 0, 0.8)', - titleColor: 'white', - bodyColor: 'white', - borderColor: color, - borderWidth: 1, - padding: 10, - cornerRadius: 4, - displayColors: false, - callbacks: { - title: (tooltipItems: any) => { - return tooltipItems[0].label; // Show timestamp - }, - label: (context: any) => { - const value = context.raw; - - if (label === 'Memory') { - return `Memory: ${value.toFixed(1)}%`; - } else if (label === 'CPU') { - return `CPU: ${value.toFixed(1)}%`; - } else if (label === 'Battery') { - return `Battery: ${value.toFixed(1)}%`; - } else if (label === 'Network') { - return `Network: ${value.toFixed(1)} Mbps`; - } else if (label === 'Disk') { - return `Disk: ${value.toFixed(1)}%`; - } - - return `${label}: ${value.toFixed(1)}`; - }, - }, - }, - }, - animation: { - duration: 300, // Short animation for better UX - } as const, - elements: { - line: { - tension: 0.3, - }, - }, - }; - - return ( -
- -
- ); - }, - [metricsHistory.timestamps], - ); - - // Function to handle sorting - const handleSort = (field: SortField) => { - if (sortField === field) { - // Toggle direction if clicking the same field - setSortDirection(sortDirection === 'asc' ? 'desc' : 'asc'); - } else { - // Set new field and default to descending - setSortField(field); - setSortDirection('desc'); - } - }; - - // Function to sort processes - const getSortedProcesses = () => { - if (!metrics.processes) { - return []; - } - - return [...metrics.processes].sort((a, b) => { - let comparison = 0; - - switch (sortField) { - case 'name': - comparison = a.name.localeCompare(b.name); - break; - case 'pid': - comparison = a.pid - b.pid; - break; - case 'cpu': - comparison = a.cpu - b.cpu; - break; - case 'memory': - comparison = a.memory - b.memory; - break; - } - - return sortDirection === 'asc' ? comparison : -comparison; - }); - }; - - // If we're in an environment where the task manager won't work, show a message - if (isNotSupported) { - return ( -
-
-

System Monitoring Not Available

-

- System monitoring is not available in serverless environments like Cloudflare Pages, Netlify, or Vercel. These - platforms don't provide access to the underlying system resources. -

-
-

- Why is this disabled? -
- Serverless platforms execute your code in isolated environments without access to the server's operating - system metrics like CPU, memory, and disk usage. -

-

- System monitoring features will be available when running in: -

    -
  • Local development environment
  • -
  • Virtual Machines (VMs)
  • -
  • Dedicated servers
  • -
  • Docker containers (with proper permissions)
  • -
-

-
- - {/* Testing controls - only shown in development */} - {isDevelopment && ( -
- )} -
- ); - } - - return ( -
- {/* Summary Header */} -
-
-
CPU
-
- {(metricsHistory.cpu[metricsHistory.cpu.length - 1] || 0).toFixed(1)}% -
-
-
-
Memory
-
- {Math.round(metrics.systemMemory?.percentage || 0)}% -
-
-
-
Disk
-
0 - ? metrics.disks.reduce((total, disk) => total + disk.percentage, 0) / metrics.disks.length - : 0, - ), - )} - > - {metrics.disks && metrics.disks.length > 0 - ? Math.round(metrics.disks.reduce((total, disk) => total + disk.percentage, 0) / metrics.disks.length) - : 0} - % -
-
-
-
Network
-
{metrics.network.downlink.toFixed(1)} Mbps
-
-
- - {/* Memory Usage */} -
-

Memory Usage

-
- {/* System Physical Memory */} -
-
-
- System Memory -
-
-
- Shows your system's physical memory (RAM) usage. -
-
-
- - {Math.round(metrics.systemMemory?.percentage || 0)}% - -
- {renderUsageGraph(metricsHistory.memory, 'Memory', '#2563eb', memoryChartRef)} -
- Used: {formatBytes(metrics.systemMemory?.used || 0)} / {formatBytes(metrics.systemMemory?.total || 0)} -
-
- Free: {formatBytes(metrics.systemMemory?.free || 0)} -
-
- - {/* Swap Memory */} - {metrics.systemMemory?.swap && ( -
-
-
- Swap Memory -
-
-
- Virtual memory used when physical RAM is full. -
-
-
- - {Math.round(metrics.systemMemory.swap.percentage)}% - -
-
-
-
-
- Used: {formatBytes(metrics.systemMemory.swap.used)} / {formatBytes(metrics.systemMemory.swap.total)} -
-
- Free: {formatBytes(metrics.systemMemory.swap.free)} -
-
- )} -
-
- - {/* Disk Usage */} -
-

Disk Usage

- {metrics.disks && metrics.disks.length > 0 ? ( -
-
- System Disk - - {(metricsHistory.disk[metricsHistory.disk.length - 1] || 0).toFixed(1)}% - -
- {renderUsageGraph(metricsHistory.disk, 'Disk', '#8b5cf6', diskChartRef)} - - {/* Show only the main system disk (usually the first one) */} - {metrics.disks[0] && ( - <> -
-
-
-
-
Used: {formatBytes(metrics.disks[0].used)}
-
Free: {formatBytes(metrics.disks[0].available)}
-
Total: {formatBytes(metrics.disks[0].size)}
-
- - )} -
- ) : ( -
-
-

Disk information is not available

-

- This feature may not be supported in your environment -

-
- )} -
- - {/* Process Information */} -
-
-

Process Information

- -
-
- {metrics.processes && metrics.processes.length > 0 ? ( - <> - {/* CPU Usage Summary */} - {metrics.processes[0].name !== 'Unknown' && ( -
-
- CPU Usage - - {(metricsHistory.cpu[metricsHistory.cpu.length - 1] || 0).toFixed(1)}% Total - -
-
-
- {metrics.processes.map((process, index) => { - return ( -
- ); - })} -
-
-
-
- System:{' '} - {metrics.processes.reduce((total, proc) => total + (proc.cpu < 10 ? proc.cpu : 0), 0).toFixed(1)}% -
-
- User:{' '} - {metrics.processes.reduce((total, proc) => total + (proc.cpu >= 10 ? proc.cpu : 0), 0).toFixed(1)} - % -
-
- Idle: {(100 - (metricsHistory.cpu[metricsHistory.cpu.length - 1] || 0)).toFixed(1)}% -
-
-
- )} - -
- - - - - - - - - - - {getSortedProcesses().map((process, index) => ( - - - - - - - ))} - -
handleSort('name')} - > - Process {sortField === 'name' && (sortDirection === 'asc' ? '↑' : '↓')} - handleSort('pid')} - > - PID {sortField === 'pid' && (sortDirection === 'asc' ? '↑' : '↓')} - handleSort('cpu')} - > - CPU % {sortField === 'cpu' && (sortDirection === 'asc' ? '↑' : '↓')} - handleSort('memory')} - > - Memory {sortField === 'memory' && (sortDirection === 'asc' ? '↑' : '↓')} -
- {process.name} - {process.pid} -
-
-
-
- {process.cpu.toFixed(1)}% -
-
-
-
-
-
- {/* Calculate approximate MB based on percentage and total system memory */} - {metrics.systemMemory - ? `${formatBytes(metrics.systemMemory.total * (process.memory / 100))}` - : `${process.memory.toFixed(1)}%`} -
-
-
-
- {metrics.processes[0].error ? ( - -
- Error retrieving process information: {metrics.processes[0].error} - - ) : metrics.processes[0].name === 'Browser' ? ( - -
- Showing browser process information. System process information is not available in this - environment. - - ) : ( - Showing top {metrics.processes.length} processes by memory usage - )} -
- - ) : ( -
-
-

Process information is not available

-

- This feature may not be supported in your environment -

- -
- )} -
-
- - {/* CPU Usage Graph */} -
-

CPU Usage History

-
-
- System CPU - - {(metricsHistory.cpu[metricsHistory.cpu.length - 1] || 0).toFixed(1)}% - -
- {renderUsageGraph(metricsHistory.cpu, 'CPU', '#ef4444', cpuChartRef)} -
- Average: {(metricsHistory.cpu.reduce((a, b) => a + b, 0) / metricsHistory.cpu.length || 0).toFixed(1)}% -
-
- Peak: {Math.max(...metricsHistory.cpu).toFixed(1)}% -
-
-
- - {/* Network */} -
-

Network

-
-
-
- Connection - - {metrics.network.downlink.toFixed(1)} Mbps - -
- {renderUsageGraph(metricsHistory.network, 'Network', '#f59e0b', networkChartRef)} -
- Type: {metrics.network.type} - {metrics.network.effectiveType && ` (${metrics.network.effectiveType})`} -
-
- Latency: {Math.round(metrics.network.latency.current)}ms - - (avg: {Math.round(metrics.network.latency.average)}ms) - -
-
- Min: {Math.round(metrics.network.latency.min)}ms / Max: {Math.round(metrics.network.latency.max)}ms -
- {metrics.network.uplink && ( -
- Uplink: {metrics.network.uplink.toFixed(1)} Mbps -
- )} -
-
-
- - {/* Battery */} - {metrics.battery && ( -
-

Battery

-
-
-
- Status -
- {metrics.battery.charging && ( -
- )} - 20 ? 'text-codinit-elements-textPrimary' : 'text-red-500', - )} - > - {Math.round(metrics.battery.level)}% - -
-
- {renderUsageGraph(metricsHistory.battery, 'Battery', '#22c55e', batteryChartRef)} - {metrics.battery.timeRemaining && metrics.battery.timeRemaining !== Infinity && ( -
- {metrics.battery.charging ? 'Time to full: ' : 'Time remaining: '} - {formatTime(metrics.battery.timeRemaining)} -
- )} -
-
-
- )} - - {/* Performance */} -
-

Performance

-
-
-
- Page Load: {(metrics.performance.pageLoad / 1000).toFixed(2)}s -
-
- DOM Ready: {(metrics.performance.domReady / 1000).toFixed(2)}s -
-
- TTFB: {(metrics.performance.timing.ttfb / 1000).toFixed(2)}s -
-
- Resources: {metrics.performance.resources.total} ({formatBytes(metrics.performance.resources.size)}) -
-
-
-
- - {/* Alerts */} - {alerts.length > 0 && ( -
-
- Recent Alerts - -
-
- {alerts.slice(-5).map((alert, index) => ( -
-
- {alert.message} - - {new Date(alert.timestamp).toLocaleTimeString()} - -
- ))} -
-
- )} -
- ); -}; - -export default React.memo(TaskManagerTab); - -// Helper function to format bytes -const formatBytes = (bytes: number): string => { - if (bytes === 0) { - return '0 B'; - } - - const k = 1024; - const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - const value = bytes / Math.pow(k, i); - - // Format with 2 decimal places for MB and larger units - const formattedValue = i >= 2 ? value.toFixed(2) : value.toFixed(0); - - return `${formattedValue} ${sizes[i]}`; -}; - -// Helper function to format time -const formatTime = (seconds: number): string => { - if (!isFinite(seconds) || seconds === 0) { - return 'Unknown'; - } - - const hours = Math.floor(seconds / 3600); - const minutes = Math.floor((seconds % 3600) / 60); - - if (hours > 0) { - return `${hours}h ${minutes}m`; - } - - return `${minutes}m`; -}; From 15d4ce0c346192cd71e955ab139db5b30d3d029e Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 18 Dec 2025 01:59:08 +1100 Subject: [PATCH 056/286] remove mock feature flags from ControlPanel --- app/components/@settings/core/ControlPanel.tsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/components/@settings/core/ControlPanel.tsx b/app/components/@settings/core/ControlPanel.tsx index b95d2559..c1fd16fd 100644 --- a/app/components/@settings/core/ControlPanel.tsx +++ b/app/components/@settings/core/ControlPanel.tsx @@ -9,7 +9,6 @@ import { TabTile } from '~/components/@settings/shared/components/TabTile'; import { SearchInterface } from '~/components/@settings/shared/components/SearchInterface'; import { initializeSearchIndex } from '~/components/@settings/shared/utils/settingsSearch'; import { useUpdateCheck } from '~/lib/hooks/useUpdateCheck'; -import { useFeatures } from '~/lib/hooks/useFeatures'; import { useNotifications } from '~/lib/hooks/useNotifications'; import { useConnectionStatus } from '~/lib/hooks/useConnectionStatus'; import { useDebugStatus } from '~/lib/hooks/useDebugStatus'; @@ -168,7 +167,6 @@ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => { // Status hooks const { hasUpdate, currentVersion, acknowledgeUpdate } = useUpdateCheck(); - const { hasNewFeatures, unviewedFeatures, acknowledgeAllFeatures } = useFeatures(); const { hasUnreadNotifications, unreadNotifications, markAllAsRead } = useNotifications(); const { hasConnectionIssues, currentIssue, acknowledgeIssue } = useConnectionStatus(); const { hasActiveWarnings, activeIssues, acknowledgeAllIssues } = useDebugStatus(); @@ -358,8 +356,6 @@ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => { switch (tabId) { case 'update': return hasUpdate; - case 'features': - return hasNewFeatures; case 'notifications': return hasUnreadNotifications; case 'connection': @@ -375,8 +371,6 @@ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => { switch (tabId) { case 'update': return `New update available (v${currentVersion})`; - case 'features': - return `${unviewedFeatures.length} new feature${unviewedFeatures.length === 1 ? '' : 's'} to explore`; case 'notifications': return `${unreadNotifications.length} unread notification${unreadNotifications.length === 1 ? '' : 's'}`; case 'connection': @@ -406,9 +400,6 @@ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => { case 'update': acknowledgeUpdate(); break; - case 'features': - acknowledgeAllFeatures(); - break; case 'notifications': markAllAsRead(); break; From 44c61c0bfca9f9864ee03d6f3ad3160ce608eb57 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 18 Dec 2025 03:08:38 +1100 Subject: [PATCH 057/286] delete mock features hook and API files --- app/lib/api/features.ts | 35 ------------------ app/lib/hooks/index.ts | 1 - app/lib/hooks/useFeatures.ts | 72 ------------------------------------ 3 files changed, 108 deletions(-) delete mode 100644 app/lib/api/features.ts delete mode 100644 app/lib/hooks/useFeatures.ts diff --git a/app/lib/api/features.ts b/app/lib/api/features.ts deleted file mode 100644 index c3ec533d..00000000 --- a/app/lib/api/features.ts +++ /dev/null @@ -1,35 +0,0 @@ -export interface Feature { - id: string; - name: string; - description: string; - viewed: boolean; - releaseDate: string; -} - -export const getFeatureFlags = async (): Promise => { - /* - * TODO: Implement actual feature flags logic - * This is a mock implementation - */ - return [ - { - id: 'feature-1', - name: 'Dark Mode', - description: 'Enable dark mode for better night viewing', - viewed: true, - releaseDate: '2024-03-15', - }, - { - id: 'feature-2', - name: 'Tab Management', - description: 'Customize your tab layout', - viewed: false, - releaseDate: '2024-03-20', - }, - ]; -}; - -export const markFeatureViewed = async (featureId: string): Promise => { - /* TODO: Implement actual feature viewed logic */ - console.log(`Marking feature ${featureId} as viewed`); -}; diff --git a/app/lib/hooks/index.ts b/app/lib/hooks/index.ts index e2f61334..f3777421 100644 --- a/app/lib/hooks/index.ts +++ b/app/lib/hooks/index.ts @@ -5,7 +5,6 @@ export * from './StickToBottom'; export * from './useEditChatDescription'; export { default } from './useViewport'; export { useUpdateCheck } from './useUpdateCheck'; -export { useFeatures } from './useFeatures'; export { useNotifications } from './useNotifications'; export { useConnectionStatus } from './useConnectionStatus'; export { useDebugStatus } from './useDebugStatus'; diff --git a/app/lib/hooks/useFeatures.ts b/app/lib/hooks/useFeatures.ts deleted file mode 100644 index d62a03e3..00000000 --- a/app/lib/hooks/useFeatures.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { useState, useEffect } from 'react'; -import { getFeatureFlags, markFeatureViewed, type Feature } from '~/lib/api/features'; - -const VIEWED_FEATURES_KEY = 'codinit_viewed_features'; - -const getViewedFeatures = (): string[] => { - try { - const stored = localStorage.getItem(VIEWED_FEATURES_KEY); - return stored ? JSON.parse(stored) : []; - } catch { - return []; - } -}; - -const setViewedFeatures = (featureIds: string[]) => { - try { - localStorage.setItem(VIEWED_FEATURES_KEY, JSON.stringify(featureIds)); - } catch (error) { - console.error('Failed to persist viewed features:', error); - } -}; - -export const useFeatures = () => { - const [hasNewFeatures, setHasNewFeatures] = useState(false); - const [unviewedFeatures, setUnviewedFeatures] = useState([]); - const [viewedFeatureIds, setViewedFeatureIds] = useState(() => getViewedFeatures()); - - useEffect(() => { - const checkNewFeatures = async () => { - try { - const features = await getFeatureFlags(); - const unviewed = features.filter((feature) => !viewedFeatureIds.includes(feature.id)); - setUnviewedFeatures(unviewed); - setHasNewFeatures(unviewed.length > 0); - } catch (error) { - console.error('Failed to check for new features:', error); - } - }; - - checkNewFeatures(); - }, [viewedFeatureIds]); - - const acknowledgeFeature = async (featureId: string) => { - try { - await markFeatureViewed(featureId); - - const newViewedIds = [...viewedFeatureIds, featureId]; - setViewedFeatureIds(newViewedIds); - setViewedFeatures(newViewedIds); - setUnviewedFeatures((prev) => prev.filter((feature) => feature.id !== featureId)); - setHasNewFeatures(unviewedFeatures.length > 1); - } catch (error) { - console.error('Failed to acknowledge feature:', error); - } - }; - - const acknowledgeAllFeatures = async () => { - try { - await Promise.all(unviewedFeatures.map((feature) => markFeatureViewed(feature.id))); - - const newViewedIds = [...viewedFeatureIds, ...unviewedFeatures.map((f) => f.id)]; - setViewedFeatureIds(newViewedIds); - setViewedFeatures(newViewedIds); - setUnviewedFeatures([]); - setHasNewFeatures(false); - } catch (error) { - console.error('Failed to acknowledge all features:', error); - } - }; - - return { hasNewFeatures, unviewedFeatures, acknowledgeFeature, acknowledgeAllFeatures }; -}; From 5482c5df22dc3e0506daf2bdcbe87f05df4cb46f Mon Sep 17 00:00:00 2001 From: Gerome <186273274+Gerome-Elassaad@users.noreply.github.com> Date: Thu, 18 Dec 2025 05:41:03 +1100 Subject: [PATCH 058/286] Revise README for improved content and structure Updated README to enhance clarity and include new links. --- README.md | 125 +++++++++++++++++++++++------------------------------- 1 file changed, 54 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 1c0649a8..c4223c04 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ - -hero-image - -

- - Featured on HuntScreens + CodinIT.dev Hero +

+ + Fazier badge

@@ -14,115 +12,100 @@ height="48" srcset="https://a.fsdn.com/con/app/sf-download-button?button_size=2x 2x"> +

+ ⚡ CodinIT.dev — Open‑Source AI App Builder ⚡
+ Build, manage, and deploy intelligent applications faster — directly from your browser or desktop.

+--- + +✨ What is CodinIT.dev? + +CodinIT.dev is an open‑source, AI‑powered full‑stack development platform designed to help you build modern Node.js applications with speed and precision. It combines code generation, project management, and deployment tools into a single workflow — powered by your choice of AI providers. + +Whether you’re prototyping, scaling a SaaS product, or experimenting with local LLMs, CodinIT.dev adapts to your stack and your workflow. -

- ⚡ CodinIT.dev — OpenSource AI App Builder ⚡
- Build, manage, and deploy intelligent applications directly from your browser or desktop. -

--- -## 🚀 Quick Start +🚀 Quick Start -Get up and running with **CodinIT.dev** in just a few steps. +Get up and running in minutes. -### 1️⃣ Clone the Repository +1️⃣ Clone the Repository -```bash git clone https://github.com/codinit-dev/codinit-dev.git -cd codinit-app -```` +cd codinit-dev -### Install Dependencies +2️⃣ Install Dependencies -```bash # npm npm install # or pnpm pnpm install -# or yarn -yarn install -``` +3️⃣ Configure Environment -### 2️⃣ Set Up the Database +Create a .env file and add your preferred AI provider keys: -Ensure you have a PostgreSQL database running. (Supabase recommended.) +OPENAI_API_KEY=your_key_here +ANTHROPIC_API_KEY=your_key_here -### 3️⃣ Configure Environment +(You can mix and match multiple providers.) -```bash -cp .env.example .env.local -``` +4️⃣ Run the Dev Server -Add your keys: +pnpm run dev -```bash -OPENAI_API_KEY=your_openai_key -ANTHROPIC_API_KEY=your_anthropic_key -SUPABASE_URL=your_supabase_url -SUPABASE_ANON_KEY=your_supabase_anon_key -``` +The app will be available at: 👉 http://localhost:5173 -### 4️⃣ Run the Dev Server -```bash -pnpm run dev -``` +--- -The app will be available at: -👉 [http://localhost:5173](http://localhost:5173) +🧩 Key Features ---- +🧠 AI‑powered full‑stack development for Node.js apps -## 🧩 Key Features +🌐 19+ AI provider integrations (cloud & local) -* 🧠 AI-powered full-stack development for Node.js apps -* 🌐 Integrations with 19+ AI providers -* 🖥️ Web + Desktop (Electron) support -* 🐳 Docker-ready, deployable to Vercel/Netlify/GitHub Pages -* 🔍 Built-in search, diff view, and file locking system -* 🧰 Supabase integration, data visualization, and voice prompting +🖥️ Web + Desktop (Electron) support ---- +🐳 Docker‑ready — deploy to Vercel, Netlify, or GitHub Pages + +🔍 Built‑in search, diff viewer & file‑locking -## 🔑 API Providers +🧰 Supabase integration, data visualization & voice prompting + +🔐 Provider‑agnostic architecture — no vendor lock‑in -**Cloud Providers:** -OpenAI, Anthropic, Google, Groq, xAI, DeepSeek, Cohere, Mistral, Together, Perplexity, HuggingFace, OpenRouter, and more. -**Local:** -Ollama, LM Studio, OpenAI-compatible local endpoints. --- -## 🖥️ Desktop & Docker Options +🔑 Supported AI Providers -### Run via Docker +☁️ Cloud Providers -```bash -npm run dockerbuild -docker compose --profile development up -``` +OpenAI · Anthropic · Google · Groq · xAI · DeepSeek · Cohere · Mistral · Together · Perplexity · HuggingFace · OpenRouter · and more + +🏠 Local Providers + +Ollama · LM Studio · OpenAI‑compatible local endpoints -### Run as Desktop App +Use one provider or switch dynamically per task. -Download the latest release: -👉 [Latest Release](https://github.com/codinit-dev/codinit-dev/releases/latest) --- -## 🤝 Contributing +🖥️ Desktop & Docker Usage -We welcome contributions! -Open an issue, submit a PR, or join discussions to help shape the future of CodinIT.dev. +Run with Docker ---- +npm run dockerbuild +docker compose --profile development up -

- CodinIT.dev — Build Faster. Code Smarter.
- Download the latest version → -

+Run as a Desktop App + +Download the latest prebuilt release: 👉 https://github.com/codinit-dev/codinit-dev/releases/latest +Available for macOS, Windows, and Linux. From 9172e46aef575b8c4b99b489ecc76ba7f046ae8e Mon Sep 17 00:00:00 2001 From: Gerome <186273274+Gerome-Elassaad@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:34:21 +1100 Subject: [PATCH 059/286] Update README with setup instructions Added instructions for cloning the repository and installing dependencies. --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c4223c04..2da2d6fa 100644 --- a/README.md +++ b/README.md @@ -33,29 +33,33 @@ Get up and running in minutes. 1️⃣ Clone the Repository +``` git clone https://github.com/codinit-dev/codinit-dev.git cd codinit-dev +``` 2️⃣ Install Dependencies +``` # npm npm install # or pnpm pnpm install +``` + 3️⃣ Configure Environment Create a .env file and add your preferred AI provider keys: -OPENAI_API_KEY=your_key_here -ANTHROPIC_API_KEY=your_key_here - (You can mix and match multiple providers.) 4️⃣ Run the Dev Server +``` pnpm run dev +``` The app will be available at: 👉 http://localhost:5173 @@ -94,16 +98,15 @@ Ollama · LM Studio · OpenAI‑compatible local endpoints Use one provider or switch dynamically per task. - --- 🖥️ Desktop & Docker Usage Run with Docker - +``` npm run dockerbuild docker compose --profile development up - +``` Run as a Desktop App Download the latest prebuilt release: 👉 https://github.com/codinit-dev/codinit-dev/releases/latest From a3e5109107215d28d5046182bb504ba45ee5aa02 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 19 Dec 2025 18:46:55 +1100 Subject: [PATCH 060/286] fix: check providerSettings for Ollama/LMStudio baseUrl configuration --- app/lib/modules/llm/manager.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/lib/modules/llm/manager.ts b/app/lib/modules/llm/manager.ts index bf1e3fa5..aaaca229 100644 --- a/app/lib/modules/llm/manager.ts +++ b/app/lib/modules/llm/manager.ts @@ -113,6 +113,7 @@ export class LLMManager { provider: BaseProvider, apiKeys?: Record, serverEnv?: Record, + providerSettings?: Record, ): boolean { // Check if provider has API key configuration const config = provider.config; @@ -128,7 +129,10 @@ export class LLMManager { // For local providers like Ollama and LMStudio, check if baseUrl is configured if (provider.name === 'Ollama' || provider.name === 'LMStudio') { const baseUrlKey = provider.name === 'Ollama' ? 'OLLAMA_API_BASE_URL' : 'LMSTUDIO_API_BASE_URL'; - const hasBaseUrl = apiKeys?.[baseUrlKey] || serverEnv?.[baseUrlKey]; + const hasBaseUrl = + providerSettings?.[provider.name]?.baseUrl || + apiKeys?.[baseUrlKey] || + serverEnv?.[baseUrlKey]; if (!hasBaseUrl) { return false; @@ -217,7 +221,7 @@ export class LLMManager { // Check if provider has required configuration before attempting fetch const providerConfig = providerSettings?.[provider.name]; - const hasRequiredConfig = this._hasRequiredConfiguration(provider, apiKeys, serverEnv); + const hasRequiredConfig = this._hasRequiredConfiguration(provider, apiKeys, serverEnv, providerSettings); if (!hasRequiredConfig) { logger.debug(`Skipping ${provider.name}: missing required configuration`); From e98393d866f9bc0c16bc2cbb8a487ef2be584a21 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 19 Dec 2025 18:50:18 +1100 Subject: [PATCH 061/286] fix: add error handling and proper Docker host mapping to Ollama provider --- app/lib/modules/llm/providers/ollama.ts | 42 ++++++++++++++++++++----- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/app/lib/modules/llm/providers/ollama.ts b/app/lib/modules/llm/providers/ollama.ts index 0c82c987..ac31d39b 100644 --- a/app/lib/modules/llm/providers/ollama.ts +++ b/app/lib/modules/llm/providers/ollama.ts @@ -83,18 +83,36 @@ export default class OllamaProvider extends BaseProvider { */ const isDocker = process?.env?.RUNNING_IN_DOCKER === 'true' || serverEnv?.RUNNING_IN_DOCKER === 'true'; - baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl; - baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl; + if (isDocker) { + try { + const url = new URL(baseUrl); + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') { + url.hostname = 'host.docker.internal'; + baseUrl = url.toString().replace(/\/$/, ''); + } + } catch (error) { + logger.warn('Failed to parse Ollama baseUrl for Docker mapping:', error); + } + } } const response = await fetch(`${baseUrl}/api/tags`); + + if (!response.ok) { + throw new Error( + `Failed to fetch Ollama models: HTTP ${response.status} ${response.statusText}`, + ); + } + const data = (await response.json()) as OllamaApiResponse; - // console.log({ ollamamodels: data.models }); + if (!data || !Array.isArray(data.models)) { + throw new Error('Invalid response from Ollama API: missing models array'); + } return data.models.map((model: OllamaModel) => ({ name: model.name, - label: `${model.name} (${model.details.parameter_size})`, + label: `${model.name} (${model.details?.parameter_size || 'unknown'})`, provider: this.name, maxTokenAllowed: 8000, maxCompletionTokens: 8000, @@ -119,14 +137,24 @@ export default class OllamaProvider extends BaseProvider { defaultApiTokenKey: '', }); - // Backend: Check if we're running in Docker if (!baseUrl) { throw new Error('No baseUrl found for OLLAMA provider'); } + // Backend: Check if we're running in Docker const isDocker = process?.env?.RUNNING_IN_DOCKER === 'true' || envRecord.RUNNING_IN_DOCKER === 'true'; - baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl; - baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl; + + if (isDocker) { + try { + const url = new URL(baseUrl); + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') { + url.hostname = 'host.docker.internal'; + baseUrl = url.toString().replace(/\/$/, ''); + } + } catch (error) { + logger.warn('Failed to parse Ollama baseUrl for Docker mapping:', error); + } + } logger.debug('Ollama Base Url used: ', baseUrl); From 4826555c7e4c5a04bbd44adebdecf659b9adff10 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 19 Dec 2025 19:06:20 +1100 Subject: [PATCH 062/286] fix: use provider settings baseUrl in LocalProvidersTab instead of hardcoded URL --- app/components/@settings/core/constants.ts | 4 --- .../providers/cloud/CloudProvidersTab.tsx | 2 +- .../providers/local/LocalProvidersTab.tsx | 25 ++++++++++++++++--- app/lib/modules/llm/manager.ts | 5 +--- app/lib/modules/llm/providers/ollama.ts | 6 ++--- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/app/components/@settings/core/constants.ts b/app/components/@settings/core/constants.ts index d74c211a..bd0a95ab 100644 --- a/app/components/@settings/core/constants.ts +++ b/app/components/@settings/core/constants.ts @@ -62,13 +62,11 @@ export const DEFAULT_TAB_CONFIG = [ { id: 'local-providers', visible: true, window: 'user' as const, order: 3 }, { id: 'connection', visible: true, window: 'user' as const, order: 4 }, { id: 'notifications', visible: true, window: 'user' as const, order: 5 }, - { id: 'event-logs', visible: true, window: 'user' as const, order: 6 }, // User Window Tabs (In dropdown, initially hidden) { id: 'profile', visible: false, window: 'user' as const, order: 7 }, { id: 'settings', visible: false, window: 'user' as const, order: 8 }, { id: 'api-keys', visible: true, window: 'user' as const, order: 9 }, - { id: 'task-manager', visible: false, window: 'user' as const, order: 10 }, { id: 'service-status', visible: false, window: 'user' as const, order: 11 }, // User Window Tabs (Hidden, controlled by TaskManagerTab) @@ -82,11 +80,9 @@ export const DEFAULT_TAB_CONFIG = [ { id: 'local-providers', visible: true, window: 'developer' as const, order: 3 }, { id: 'connection', visible: true, window: 'developer' as const, order: 4 }, { id: 'notifications', visible: true, window: 'developer' as const, order: 5 }, - { id: 'event-logs', visible: true, window: 'developer' as const, order: 6 }, { id: 'profile', visible: true, window: 'developer' as const, order: 7 }, { id: 'settings', visible: true, window: 'developer' as const, order: 8 }, { id: 'api-keys', visible: true, window: 'developer' as const, order: 9 }, - { id: 'task-manager', visible: true, window: 'developer' as const, order: 10 }, { id: 'service-status', visible: true, window: 'developer' as const, order: 11 }, { id: 'debug', visible: true, window: 'developer' as const, order: 12 }, { id: 'update', visible: true, window: 'developer' as const, order: 13 }, diff --git a/app/components/@settings/tabs/providers/cloud/CloudProvidersTab.tsx b/app/components/@settings/tabs/providers/cloud/CloudProvidersTab.tsx index 8411ff85..317df5db 100644 --- a/app/components/@settings/tabs/providers/cloud/CloudProvidersTab.tsx +++ b/app/components/@settings/tabs/providers/cloud/CloudProvidersTab.tsx @@ -44,7 +44,7 @@ const PROVIDER_ICONS: Record = { // Update PROVIDER_DESCRIPTIONS to use the same type const PROVIDER_DESCRIPTIONS: Partial> = { Anthropic: 'Access Claude and other Anthropic models', - OpenAI: 'Use GPT-4, GPT-3.5, and other OpenAI models', + OpenAI: 'Use GPT-5.2, GPT-4.5, and other OpenAI models', }; const CloudProvidersTab = () => { diff --git a/app/components/@settings/tabs/providers/local/LocalProvidersTab.tsx b/app/components/@settings/tabs/providers/local/LocalProvidersTab.tsx index 2e280b38..f0b52bc2 100644 --- a/app/components/@settings/tabs/providers/local/LocalProvidersTab.tsx +++ b/app/components/@settings/tabs/providers/local/LocalProvidersTab.tsx @@ -148,7 +148,15 @@ export default function LocalProvidersTab() { try { setIsLoadingModels(true); - const response = await fetch('http://127.0.0.1:11434/api/tags'); + const ollamaProvider = filteredProviders.find((p) => p.name === 'Ollama'); + const baseUrl = ollamaProvider?.settings.baseUrl || OLLAMA_API_URL; + + const response = await fetch(`${baseUrl}/api/tags`); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + const data = (await response.json()) as { models: OllamaModel[] }; setOllamaModels( @@ -159,6 +167,9 @@ export default function LocalProvidersTab() { ); } catch (error) { console.error('Error fetching Ollama models:', error); + + const errorMsg = error instanceof Error ? error.message : 'Unknown error occurred'; + toast(`Failed to fetch Ollama models: ${errorMsg}`); } finally { setIsLoadingModels(false); } @@ -166,7 +177,10 @@ export default function LocalProvidersTab() { const updateOllamaModel = async (modelName: string): Promise => { try { - const response = await fetch(`${OLLAMA_API_URL}/api/pull`, { + const ollamaProvider = filteredProviders.find((p) => p.name === 'Ollama'); + const baseUrl = ollamaProvider?.settings.baseUrl || OLLAMA_API_URL; + + const response = await fetch(`${baseUrl}/api/pull`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: modelName }), @@ -218,7 +232,7 @@ export default function LocalProvidersTab() { } } - const updatedResponse = await fetch('http://127.0.0.1:11434/api/tags'); + const updatedResponse = await fetch(`${baseUrl}/api/tags`); const updatedData = (await updatedResponse.json()) as { models: OllamaModel[] }; const updatedModel = updatedData.models.find((m) => m.name === modelName); @@ -275,7 +289,10 @@ export default function LocalProvidersTab() { const handleDeleteOllamaModel = async (modelName: string) => { try { - const response = await fetch(`${OLLAMA_API_URL}/api/delete`, { + const ollamaProvider = filteredProviders.find((p) => p.name === 'Ollama'); + const baseUrl = ollamaProvider?.settings.baseUrl || OLLAMA_API_URL; + + const response = await fetch(`${baseUrl}/api/delete`, { method: 'DELETE', headers: { 'Content-Type': 'application/json', diff --git a/app/lib/modules/llm/manager.ts b/app/lib/modules/llm/manager.ts index aaaca229..d4488fed 100644 --- a/app/lib/modules/llm/manager.ts +++ b/app/lib/modules/llm/manager.ts @@ -129,10 +129,7 @@ export class LLMManager { // For local providers like Ollama and LMStudio, check if baseUrl is configured if (provider.name === 'Ollama' || provider.name === 'LMStudio') { const baseUrlKey = provider.name === 'Ollama' ? 'OLLAMA_API_BASE_URL' : 'LMSTUDIO_API_BASE_URL'; - const hasBaseUrl = - providerSettings?.[provider.name]?.baseUrl || - apiKeys?.[baseUrlKey] || - serverEnv?.[baseUrlKey]; + const hasBaseUrl = providerSettings?.[provider.name]?.baseUrl || apiKeys?.[baseUrlKey] || serverEnv?.[baseUrlKey]; if (!hasBaseUrl) { return false; diff --git a/app/lib/modules/llm/providers/ollama.ts b/app/lib/modules/llm/providers/ollama.ts index ac31d39b..ae6ccd5c 100644 --- a/app/lib/modules/llm/providers/ollama.ts +++ b/app/lib/modules/llm/providers/ollama.ts @@ -86,6 +86,7 @@ export default class OllamaProvider extends BaseProvider { if (isDocker) { try { const url = new URL(baseUrl); + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') { url.hostname = 'host.docker.internal'; baseUrl = url.toString().replace(/\/$/, ''); @@ -99,9 +100,7 @@ export default class OllamaProvider extends BaseProvider { const response = await fetch(`${baseUrl}/api/tags`); if (!response.ok) { - throw new Error( - `Failed to fetch Ollama models: HTTP ${response.status} ${response.statusText}`, - ); + throw new Error(`Failed to fetch Ollama models: HTTP ${response.status} ${response.statusText}`); } const data = (await response.json()) as OllamaApiResponse; @@ -147,6 +146,7 @@ export default class OllamaProvider extends BaseProvider { if (isDocker) { try { const url = new URL(baseUrl); + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') { url.hostname = 'host.docker.internal'; baseUrl = url.toString().replace(/\/$/, ''); From 3920af6edcf81c19044c9b4d998791b85f58265b Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 19 Dec 2025 19:07:55 +1100 Subject: [PATCH 063/286] fix: add error handling and proper Docker host mapping to LMStudio provider --- app/lib/modules/llm/providers/lmstudio.ts | 37 ++++++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/app/lib/modules/llm/providers/lmstudio.ts b/app/lib/modules/llm/providers/lmstudio.ts index b592048a..d00af7bb 100644 --- a/app/lib/modules/llm/providers/lmstudio.ts +++ b/app/lib/modules/llm/providers/lmstudio.ts @@ -42,13 +42,33 @@ export default class LMStudioProvider extends BaseProvider { */ const isDocker = process?.env?.RUNNING_IN_DOCKER === 'true' || serverEnv?.RUNNING_IN_DOCKER === 'true'; - baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl; - baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl; + if (isDocker) { + try { + const url = new URL(baseUrl); + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') { + url.hostname = 'host.docker.internal'; + baseUrl = url.toString().replace(/\/$/, ''); + } + } catch (error) { + logger.warn('Failed to parse LMStudio baseUrl for Docker mapping:', error); + } + } } const response = await fetch(`${baseUrl}/v1/models`); + + if (!response.ok) { + throw new Error( + `Failed to fetch LMStudio models: HTTP ${response.status} ${response.statusText}`, + ); + } + const data = (await response.json()) as { data: Array<{ id: string }> }; + if (!data || !Array.isArray(data.data)) { + throw new Error('Invalid response from LMStudio API: missing data array'); + } + return data.data.map((model) => ({ name: model.id, label: model.id, @@ -78,9 +98,16 @@ export default class LMStudioProvider extends BaseProvider { const isDocker = process?.env?.RUNNING_IN_DOCKER === 'true' || serverEnv?.RUNNING_IN_DOCKER === 'true'; - if (typeof window === 'undefined') { - baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl; - baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl; + if (typeof window === 'undefined' && isDocker) { + try { + const url = new URL(baseUrl); + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') { + url.hostname = 'host.docker.internal'; + baseUrl = url.toString().replace(/\/$/, ''); + } + } catch (error) { + logger.warn('Failed to parse LMStudio baseUrl for Docker mapping:', error); + } } logger.debug('LMStudio Base Url used: ', baseUrl); From 987bdeece00fa79469fb1313d9a659eba49d462c Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 18 Dec 2025 03:56:26 +1100 Subject: [PATCH 064/286] bump version v1.1.24 > v1.1.25 --- app/routes/api.update.ts | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/routes/api.update.ts b/app/routes/api.update.ts index d3bb1344..0c68c45a 100644 --- a/app/routes/api.update.ts +++ b/app/routes/api.update.ts @@ -1,6 +1,6 @@ import { json, type ActionFunction } from '@remix-run/cloudflare'; -const CURRENT_VERSION = '1.1.24'; +const CURRENT_VERSION = '1.1.25'; const GITHUB_REPO = 'codinit-dev/codinit-dev'; interface GitHubRelease { diff --git a/package.json b/package.json index a7d6a3d7..9dadbea2 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "license": "MIT", "sideEffects": false, "type": "module", - "version": "1.1.24", + "version": "1.1.25", "author": { "name": "Gerome-Elassaad", "email": "contact@codinit.dev" From be6bbad76c2281355625399e0454143645e18b66 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 20 Dec 2025 20:13:37 +1100 Subject: [PATCH 065/286] fix: lint errors in lmstudio provider --- .github/workflows/electron.yml | 6 ++++-- app/lib/modules/llm/providers/lmstudio.ts | 6 +++--- electron-builder.yml | 5 ++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml index 1cf68746..9d1c1261 100644 --- a/.github/workflows/electron.yml +++ b/.github/workflows/electron.yml @@ -69,7 +69,7 @@ jobs: - name: Build Electron app env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.TOKEN }} NODE_OPTIONS: "--max_old_space_size=4096" run: | if [ "$RUNNER_OS" == "Windows" ]; then @@ -92,6 +92,7 @@ jobs: dist/*.AppImage dist/*.zip dist/*.blockmap + dist/*.yml retention-days: 1 if-no-files-found: warn @@ -122,5 +123,6 @@ jobs: artifacts/**/*.AppImage artifacts/**/*.zip artifacts/**/*.blockmap + artifacts/**/*.yml env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.TOKEN }} diff --git a/app/lib/modules/llm/providers/lmstudio.ts b/app/lib/modules/llm/providers/lmstudio.ts index d00af7bb..82fa48e7 100644 --- a/app/lib/modules/llm/providers/lmstudio.ts +++ b/app/lib/modules/llm/providers/lmstudio.ts @@ -45,6 +45,7 @@ export default class LMStudioProvider extends BaseProvider { if (isDocker) { try { const url = new URL(baseUrl); + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') { url.hostname = 'host.docker.internal'; baseUrl = url.toString().replace(/\/$/, ''); @@ -58,9 +59,7 @@ export default class LMStudioProvider extends BaseProvider { const response = await fetch(`${baseUrl}/v1/models`); if (!response.ok) { - throw new Error( - `Failed to fetch LMStudio models: HTTP ${response.status} ${response.statusText}`, - ); + throw new Error(`Failed to fetch LMStudio models: HTTP ${response.status} ${response.statusText}`); } const data = (await response.json()) as { data: Array<{ id: string }> }; @@ -101,6 +100,7 @@ export default class LMStudioProvider extends BaseProvider { if (typeof window === 'undefined' && isDocker) { try { const url = new URL(baseUrl); + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') { url.hostname = 'host.docker.internal'; baseUrl = url.toString().replace(/\/$/, ''); diff --git a/electron-builder.yml b/electron-builder.yml index 17243090..13603b1f 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -80,7 +80,10 @@ nsis: npmRebuild: false -publish: null +publish: + provider: github + owner: codinit-dev + repo: codinit-dev electronDownload: mirror: https://npmmirror.com/mirrors/electron/ From beb7fe5838ae911a757ffac12cb9ee6f495404c4 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 20 Dec 2025 20:16:40 +1100 Subject: [PATCH 066/286] bump fixes to v1.1.26 --- app/routes/api.update.ts | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/routes/api.update.ts b/app/routes/api.update.ts index 0c68c45a..e0c1640d 100644 --- a/app/routes/api.update.ts +++ b/app/routes/api.update.ts @@ -1,6 +1,6 @@ import { json, type ActionFunction } from '@remix-run/cloudflare'; -const CURRENT_VERSION = '1.1.25'; +const CURRENT_VERSION = '1.1.26'; const GITHUB_REPO = 'codinit-dev/codinit-dev'; interface GitHubRelease { diff --git a/package.json b/package.json index 9dadbea2..30a59ef9 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "license": "MIT", "sideEffects": false, "type": "module", - "version": "1.1.25", + "version": "1.1.26", "author": { "name": "Gerome-Elassaad", "email": "contact@codinit.dev" From afcd51e95d24de85c932c6f8c06c423f15c3ce6a Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 20 Dec 2025 20:27:49 +1100 Subject: [PATCH 067/286] fix: prevent duplicate release creation and type conflicts - remove GH_TOKEN from build step (electron-builder generates files only) - add releaseType: release to prevent draft/release conflicts - GitHub Actions release job handles uploading all artifacts --- .github/workflows/electron.yml | 1 - electron-builder.yml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml index 9d1c1261..21396585 100644 --- a/.github/workflows/electron.yml +++ b/.github/workflows/electron.yml @@ -69,7 +69,6 @@ jobs: - name: Build Electron app env: - GH_TOKEN: ${{ secrets.TOKEN }} NODE_OPTIONS: "--max_old_space_size=4096" run: | if [ "$RUNNER_OS" == "Windows" ]; then diff --git a/electron-builder.yml b/electron-builder.yml index 13603b1f..bd094705 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -84,6 +84,7 @@ publish: provider: github owner: codinit-dev repo: codinit-dev + releaseType: release electronDownload: mirror: https://npmmirror.com/mirrors/electron/ From 7b918bbd6199ccb27a6da4ef68bb116d9b04e68e Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 20 Dec 2025 21:35:36 +1100 Subject: [PATCH 068/286] fix: prevent duplicate yml file uploads in release workflow --- .github/workflows/electron.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml index 21396585..b9a129f2 100644 --- a/.github/workflows/electron.yml +++ b/.github/workflows/electron.yml @@ -115,6 +115,7 @@ jobs: tag_name: ${{ github.ref_name }} draft: false name: Release ${{ github.ref_name }} + fail_on_unmatched_files: false files: | artifacts/**/*.exe artifacts/**/*.dmg @@ -122,6 +123,7 @@ jobs: artifacts/**/*.AppImage artifacts/**/*.zip artifacts/**/*.blockmap - artifacts/**/*.yml + artifacts/**/latest.yml + artifacts/**/latest-*.yml env: GITHUB_TOKEN: ${{ secrets.TOKEN }} From ca1193eaf05441f672bdd55044e42892ef556f82 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 20 Dec 2025 21:42:31 +1100 Subject: [PATCH 069/286] refactor: remove redundant GitHub API call from update checker --- app/lib/api/updates.ts | 113 +++++++++++++---------------------------- 1 file changed, 35 insertions(+), 78 deletions(-) diff --git a/app/lib/api/updates.ts b/app/lib/api/updates.ts index 84b9fc5a..c7f1c201 100644 --- a/app/lib/api/updates.ts +++ b/app/lib/api/updates.ts @@ -11,13 +11,6 @@ export interface UpdateCheckResult { }; } -interface GitHubRelease { - tag_name: string; - html_url: string; - body: string; - published_at: string; -} - interface ApiUpdateResponse { updateAvailable: boolean; currentVersion: string; @@ -29,33 +22,8 @@ interface ApiUpdateResponse { message?: string; } -function compareVersions(v1: string, v2: string): number { - // Remove 'v' prefix if present - const version1 = v1.replace(/^v/, ''); - const version2 = v2.replace(/^v/, ''); - - const parts1 = version1.split('.').map(Number); - const parts2 = version2.split('.').map(Number); - - for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) { - const part1 = parts1[i] || 0; - const part2 = parts2[i] || 0; - - if (part1 > part2) { - return 1; - } - - if (part1 < part2) { - return -1; - } - } - - return 0; -} - export const checkForUpdates = async (): Promise => { try { - // Get update info from the API route const apiResponse = await fetch('/api/update', { method: 'POST', headers: { @@ -64,70 +32,59 @@ export const checkForUpdates = async (): Promise => { }); if (!apiResponse.ok) { - throw new Error(`API request failed: ${apiResponse.status}`); - } + if (apiResponse.status === 403) { + const resetTime = apiResponse.headers.get('X-RateLimit-Reset'); - const apiData = (await apiResponse.json()) as ApiUpdateResponse; - - if (apiData.error) { - throw new Error(apiData.message || 'API returned an error'); - } - - const currentVersion = apiData.currentVersion; - - // Fetch the latest release from GitHub - const response = await fetch(`https://api.github.com/repos/codinit-dev/codinit-dev/releases/latest`, { - headers: { - Accept: 'application/vnd.github.v3+json', - 'User-Agent': 'codinit-dev', - }, - }); - - if (!response.ok) { - // If no releases found or repo doesn't exist - if (response.status === 404) { return { available: false, - version: currentVersion, - currentVersion, - }; - } - - // Check for rate limiting - if (response.status === 403) { - const resetTime = response.headers.get('X-RateLimit-Reset'); - return { - available: false, - version: currentVersion, - currentVersion, + version: 'unknown', + currentVersion: 'unknown', error: { type: 'rate_limit', - message: `GitHub API rate limit exceeded. ${resetTime ? `Resets at ${new Date(parseInt(resetTime) * 1000).toLocaleTimeString()}` : ''}`, + message: `GitHub API rate limit exceeded. ${resetTime ? `Resets at ${new Date(parseInt(resetTime) * 1000).toLocaleTimeString()}` : 'Try again later.'}`, }, }; } - throw new Error(`GitHub API returned ${response.status}`); + throw new Error(`API request failed: ${apiResponse.status}`); } - const release = (await response.json()) as GitHubRelease; - const latestVersion = release.tag_name.replace(/^v/, ''); // Remove 'v' prefix if present + const apiData = (await apiResponse.json()) as ApiUpdateResponse; + + if (apiData.error) { + const errorMessage = apiData.message || 'API returned an error'; + let errorType: 'rate_limit' | 'network' | 'auth' | 'unknown' = 'unknown'; + + if (errorMessage.toLowerCase().includes('rate limit')) { + errorType = 'rate_limit'; + } else if (errorMessage.toLowerCase().includes('network') || errorMessage.toLowerCase().includes('fetch')) { + errorType = 'network'; + } else if (errorMessage.toLowerCase().includes('auth') || errorMessage.toLowerCase().includes('403')) { + errorType = 'auth'; + } - // Compare versions - const updateAvailable = compareVersions(latestVersion, currentVersion) > 0; + return { + available: false, + version: apiData.currentVersion, + currentVersion: apiData.currentVersion, + error: { + type: errorType, + message: errorMessage, + }, + }; + } return { - available: updateAvailable, - version: latestVersion, - currentVersion, - releaseNotes: release.body, - releaseUrl: release.html_url, - publishedAt: release.published_at, + available: apiData.updateAvailable, + version: apiData.latestVersion || apiData.currentVersion, + currentVersion: apiData.currentVersion, + releaseNotes: apiData.releaseNotes, + releaseUrl: apiData.releaseUrl, + publishedAt: apiData.publishedAt, }; } catch (error) { console.error('Error checking for updates:', error); - // Determine error type const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; const isNetworkError = errorMessage.toLowerCase().includes('network') || From c31eba4bd86a86aba0af800e2413a1e9bb34cf2b Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 20 Dec 2025 21:48:08 +1100 Subject: [PATCH 070/286] refactor: centralize version and repository configuration --- app/lib/version.ts | 2 ++ app/routes/api.update.ts | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 app/lib/version.ts diff --git a/app/lib/version.ts b/app/lib/version.ts new file mode 100644 index 00000000..9b208db1 --- /dev/null +++ b/app/lib/version.ts @@ -0,0 +1,2 @@ +export const APP_VERSION = '1.1.26'; +export const GITHUB_REPOSITORY = 'codinit-dev/codinit-dev'; diff --git a/app/routes/api.update.ts b/app/routes/api.update.ts index e0c1640d..b16c9b1a 100644 --- a/app/routes/api.update.ts +++ b/app/routes/api.update.ts @@ -1,7 +1,8 @@ import { json, type ActionFunction } from '@remix-run/cloudflare'; +import { APP_VERSION, GITHUB_REPOSITORY } from '~/lib/version'; -const CURRENT_VERSION = '1.1.26'; -const GITHUB_REPO = 'codinit-dev/codinit-dev'; +const GITHUB_REPO = GITHUB_REPOSITORY; +const CURRENT_VERSION = APP_VERSION; interface GitHubRelease { tag_name: string; From df0d4b930a372122781f11104c33c1b2bbebf473 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 20 Dec 2025 21:54:02 +1100 Subject: [PATCH 071/286] refactor: use centralized repository config in UpdateTab --- app/components/@settings/tabs/update/UpdateTab.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/components/@settings/tabs/update/UpdateTab.tsx b/app/components/@settings/tabs/update/UpdateTab.tsx index 98767666..3175941d 100644 --- a/app/components/@settings/tabs/update/UpdateTab.tsx +++ b/app/components/@settings/tabs/update/UpdateTab.tsx @@ -5,6 +5,7 @@ import { toast } from 'react-toastify'; import { Dialog, DialogRoot, DialogTitle, DialogDescription, DialogButton } from '~/components/ui/Dialog'; import { classNames } from '~/utils/classNames'; import { Markdown } from '~/components/chat/Markdown'; +import { GITHUB_REPOSITORY } from '~/lib/version'; interface UpdateSettings { autoUpdate: boolean; @@ -232,7 +233,7 @@ const UpdateTab = () => {

)}

- Updates are checked from: codinit-dev/codinit-dev (GitHub releases) + Updates are checked from: {GITHUB_REPOSITORY} (GitHub releases)

{hasUpdate && releaseUrl && ( @@ -295,8 +296,8 @@ const UpdateTab = () => {

- A new version ({latestVersion}) is available from{' '} - codinit-dev/codinit-dev on GitHub. + A new version ({latestVersion}) is available from {GITHUB_REPOSITORY}{' '} + on GitHub.

{releaseUrl && ( From 488ad0569490c4fbcd22fb59415f884c34b8da5b Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Sat, 20 Dec 2025 22:01:05 +1100 Subject: [PATCH 072/286] fix: remove unnecessary z-index and transparent background from ChatHeader --- app/components/header/ChatHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/header/ChatHeader.tsx b/app/components/header/ChatHeader.tsx index 5b9c968a..61851e46 100644 --- a/app/components/header/ChatHeader.tsx +++ b/app/components/header/ChatHeader.tsx @@ -11,7 +11,7 @@ export function ChatHeader() { } return ( -
+
+ )} +
+ +
+ +
+ setApiKey(e.target.value)} + placeholder="Enter your Pro API key..." + className={classNames( + 'flex-1 px-4 py-2 rounded-lg text-sm', + 'bg-white dark:bg-[#0F0F0F]', + 'border border-gray-200 dark:border-[#2A2A2A]', + 'text-codinit-elements-textPrimary', + 'focus:outline-none focus:ring-2 focus:ring-blue-500/30', + )} + /> + +
+
+
+ + + ); +} From 2cfd57a15a0bee1d70a91a91e86aa43e1034c866 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 25 Dec 2025 20:58:24 +1100 Subject: [PATCH 085/286] feat: integrate Pro features in chat UI with Web Search and Lazy Edits toggles Migrate hardcoded colors to CSS custom properties throughout chat components. Add Web Search and Lazy Edits feature toggles with provider validation. Improve chat header styling and visual hierarchy with border separator. --- app/components/chat/BaseChat.module.scss | 30 +++++++------- app/components/chat/BaseChat.tsx | 8 +++- app/components/chat/Chatbox.tsx | 50 +++++++++++++++++++++++- app/components/header/ChatHeader.tsx | 12 +++--- 4 files changed, 76 insertions(+), 24 deletions(-) diff --git a/app/components/chat/BaseChat.module.scss b/app/components/chat/BaseChat.module.scss index 2d6dd4db..694afef9 100644 --- a/app/components/chat/BaseChat.module.scss +++ b/app/components/chat/BaseChat.module.scss @@ -125,11 +125,11 @@ } ._PromptContainer_1k1wl_1 { - background: radial-gradient(circle at 4% -40%, #cccccc 0%, transparent 30%); + background: radial-gradient(circle at 4% -40%, var(--codinit-elements-icon-tertiary) 0%, transparent 30%); } ._GradientBorder_1k1wl_5 { - border: 1px solid rgba(204, 204, 204, 0.2); + border: 1px solid var(--codinit-elements-borderColor); } @supports (-webkit-mask-composite: xor) { @@ -142,7 +142,7 @@ ._GradientBorder_1k1wl_5:before { position: absolute; padding: 1px; - background: linear-gradient(180deg, #cccccc, #fff3); + background: linear-gradient(180deg, var(--codinit-elements-borderColor), #fff3); border-radius: inherit; content: ''; inset: 0; @@ -157,21 +157,21 @@ } [data-theme='light'] ._GradientBorder_1k1wl_5:before { - background: linear-gradient(180deg, #cccccc, #0003); + background: linear-gradient(180deg, var(--codinit-elements-borderColor), #0003); } } ._LiquidGlassButton_16cym_1 { min-height: 40px; overflow: visible; - background: linear-gradient(135deg, rgba(204, 204, 204, 0.1), rgba(204, 204, 204, 0.05)); + background: linear-gradient(135deg, var(--codinit-elements-item-backgroundAccent), rgba(204, 204, 204, 0.05)); backdrop-filter: blur(20px) saturate(140%); -webkit-backdrop-filter: blur(20px) saturate(180%); box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), inset 0 -1px rgba(0, 0, 0, 0.1), 0 8px 32px -8px rgba(0, 0, 0, 0.1), - 0 0 0 1px rgba(204, 204, 204, 0.1); + 0 0 0 1px var(--codinit-elements-borderColor); transition: all 0.4s cubic-bezier(0.32, 0.72, 0, 1); will-change: transform, box-shadow; backface-visibility: hidden; @@ -209,12 +209,12 @@ } ._LiquidGlassButton_16cym_1:hover { - background: linear-gradient(135deg, rgba(204, 204, 204, 0.15), rgba(204, 204, 204, 0.08)); + background: linear-gradient(135deg, var(--codinit-elements-item-backgroundAccent), rgba(204, 204, 204, 0.08)); box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), inset 0 -1px rgba(0, 0, 0, 0.15), 0 12px 40px -8px rgba(0, 0, 0, 0.15), - 0 0 0 1px rgba(204, 204, 204, 0.15); + 0 0 0 1px var(--codinit-elements-borderColor); } ._LiquidGlassButton_16cym_1:hover:before { @@ -227,11 +227,11 @@ inset 0 1px rgba(255, 255, 255, 0.2), inset 0 -1px rgba(0, 0, 0, 0.1), 0 4px 20px -8px rgba(0, 0, 0, 0.1), - 0 0 0 1px rgba(204, 204, 204, 0.05); + 0 0 0 1px var(--codinit-elements-borderColor); } [data-theme='light'] ._LiquidGlassButton_16cym_1 { - background: linear-gradient(135deg, rgba(204, 204, 204, 0.7), rgba(204, 204, 204, 0.5)); + background: linear-gradient(135deg, var(--codinit-elements-bg-depth-3), var(--codinit-elements-bg-depth-2)); box-shadow: inset 0 1px rgba(255, 255, 255, 0.9), inset 0 -1px rgba(0, 0, 0, 0.05), @@ -249,7 +249,7 @@ } [data-theme='light'] ._LiquidGlassButton_16cym_1:hover { - background: linear-gradient(135deg, rgba(204, 204, 204, 0.95), rgba(204, 204, 204, 0.85)); + background: linear-gradient(135deg, var(--codinit-elements-bg-depth-4), var(--codinit-elements-bg-depth-3)); box-shadow: inset 0 1px rgba(255, 255, 255, 1), inset 0 -1px rgba(0, 0, 0, 0.08), @@ -271,9 +271,9 @@ background: linear-gradient( 90deg, transparent 0%, - rgba(204, 204, 204, 0.8) 20%, - rgba(255, 255, 255, 0.8) 50%, - rgba(204, 204, 204, 0.8) 80%, + var(--codinit-elements-borderColor) 20%, + var(--codinit-elements-textPrimary) 50%, + var(--codinit-elements-borderColor) 80%, transparent 100% ); opacity: 0.6; @@ -287,7 +287,7 @@ content: ''; position: absolute; inset: 0; - background: linear-gradient(90deg, transparent 0%, rgba(204, 204, 204, 0.8) 50%, transparent 100%); + background: linear-gradient(90deg, transparent 0%, var(--codinit-elements-borderColor) 50%, transparent 100%); animation: _shimmer_16cym_1 3s ease-in-out infinite; } diff --git a/app/components/chat/BaseChat.tsx b/app/components/chat/BaseChat.tsx index 07c5bdaa..5273377c 100644 --- a/app/components/chat/BaseChat.tsx +++ b/app/components/chat/BaseChat.tsx @@ -39,6 +39,7 @@ import type { ProgressAnnotation } from '~/types/context'; import { SupabaseChatAlert } from '~/components/chat/SupabaseAlert'; import { expoUrlAtom } from '~/lib/stores/qrCodeStore'; import { useStore } from '@nanostores/react'; +import { proStore } from '~/lib/stores/pro'; import { StickToBottom, useStickToBottomContext } from '~/lib/hooks'; import { ChatBox } from './Chatbox'; import type { DesignScheme } from '~/types/design-scheme'; @@ -448,7 +449,7 @@ export const BaseChat = React.forwardRef( {/* Unified Header Container - spans full width */} {chatStarted && ( -
+
{/* Chat Header Section - constrained to chat width */}
@@ -775,6 +776,11 @@ export const BaseChat = React.forwardRef( setDesignScheme={setDesignScheme} selectedElement={selectedElement} setSelectedElement={setSelectedElement} + codinit_options={{ + enable_web_search: proStore.get().features.webSearch, + enable_lazy_edits: proStore.get().features.lazyEdits, + files: uploadedFiles.length > 0, + }} />
diff --git a/app/components/chat/Chatbox.tsx b/app/components/chat/Chatbox.tsx index 77bbb718..e84ff87f 100644 --- a/app/components/chat/Chatbox.tsx +++ b/app/components/chat/Chatbox.tsx @@ -27,6 +27,7 @@ import { ToolMentionAutocomplete } from './ToolMentionAutocomplete'; import { insertToolMention, insertFileReference } from '~/utils/toolMentionParser'; import { useStore } from '@nanostores/react'; import { workbenchStore } from '~/lib/stores/workbench'; +import { proStore, toggleFeature } from '~/lib/stores/pro'; interface ChatBoxProps { isModelSettingsCollapsed: boolean; @@ -69,6 +70,11 @@ interface ChatBoxProps { setDesignScheme?: (scheme: DesignScheme) => void; selectedElement?: ElementInfo | null; setSelectedElement?: ((element: ElementInfo | null) => void) | undefined; + codinit_options?: { + enable_web_search?: boolean; + enable_lazy_edits?: boolean; + files?: boolean; + }; } export const ChatBox: React.FC = (props) => { @@ -285,11 +291,11 @@ export const ChatBox: React.FC = (props) => { )} onDragEnter={(e) => { e.preventDefault(); - e.currentTarget.style.border = '2px solid #1488fc'; + e.currentTarget.style.border = '2px solid var(--codinit-elements-borderColorActive)'; }} onDragOver={(e) => { e.preventDefault(); - e.currentTarget.style.border = '2px solid #1488fc'; + e.currentTarget.style.border = '2px solid var(--codinit-elements-borderColorActive)'; }} onDragLeave={(e) => { e.preventDefault(); @@ -413,6 +419,46 @@ export const ChatBox: React.FC = (props) => {
{props.chatMode === 'discuss' ? Discuss : } + { + if (props.provider?.name !== 'CodinIT') { + toast.info('Web Search is a Pro feature available with CodinIT Pro provider.'); + return; + } + + toggleFeature('webSearch'); + }} + > +
+ + { + if (props.provider?.name !== 'CodinIT') { + toast.info('Lazy Edits is a Pro feature available with CodinIT Pro provider.'); + return; + } + + toggleFeature('lazyEdits'); + }} + > +
+ {() => props.isModelSettingsCollapsed ? ( diff --git a/app/components/header/ChatHeader.tsx b/app/components/header/ChatHeader.tsx index 61851e46..c3e5116d 100644 --- a/app/components/header/ChatHeader.tsx +++ b/app/components/header/ChatHeader.tsx @@ -11,23 +11,23 @@ export function ChatHeader() { } return ( -
+
/ -
+
{() => }
+ ); }, ), diff --git a/app/components/workbench/CodeModeHeader.tsx b/app/components/workbench/CodeModeHeader.tsx index f538efe5..8d00cf6d 100644 --- a/app/components/workbench/CodeModeHeader.tsx +++ b/app/components/workbench/CodeModeHeader.tsx @@ -18,34 +18,31 @@ export const CodeModeHeader = memo( }; return ( -
+
{/* Toggle Buttons Section */} -
-
- setSelectedView('preview')} - /> - setSelectedView('code')} /> - setSelectedView('diff')} - /> -
+
+ setSelectedView('preview')} + /> + setSelectedView('code')} + /> + setSelectedView('diff')} + />
- +
- +
+ Publish +
diff --git a/app/components/workbench/DiffViewHeader.tsx b/app/components/workbench/DiffViewHeader.tsx index c156fbe3..39d1a36b 100644 --- a/app/components/workbench/DiffViewHeader.tsx +++ b/app/components/workbench/DiffViewHeader.tsx @@ -49,24 +49,22 @@ export const DiffViewHeader = memo( const showStats = additions > 0 || deletions > 0; return ( -
+
{/* Toggle Buttons Section */} -
-
- setSelectedView('preview')} - /> - setSelectedView('code')} /> - setSelectedView('diff')} - /> -
+
+ setSelectedView('preview')} + /> + setSelectedView('code')} /> + setSelectedView('diff')} + />
diff --git a/app/components/workbench/Preview.tsx b/app/components/workbench/Preview.tsx index cbdfad21..a9626485 100644 --- a/app/components/workbench/Preview.tsx +++ b/app/components/workbench/Preview.tsx @@ -493,11 +493,12 @@ export const Preview = memo(() => {
) : (
-
+
-
No Preview Available
-
- Start a development server to see your app +
+
Ready to Build?
+
+ Start a development server or prompt the AI to see your app in action.
diff --git a/app/components/workbench/PreviewHeader.tsx b/app/components/workbench/PreviewHeader.tsx index ad7960b9..b7f1e02d 100644 --- a/app/components/workbench/PreviewHeader.tsx +++ b/app/components/workbench/PreviewHeader.tsx @@ -112,12 +112,12 @@ export const PreviewHeader = memo( }; return ( -
+
{/* Toggle Buttons Section */} -
+
setSelectedView('preview')} /> @@ -130,13 +130,7 @@ export const PreviewHeader = memo( /> - + {/* Address Bar */} -
+
- - + className="text-codinit-elements-textSecondary" + />
{/* Right Action Buttons */} @@ -338,25 +329,19 @@ export const PreviewHeader = memo(
- {/* Deploy Dialog Button */} - + className="w-8 h-8 rounded-md bg-codinit-elements-item-backgroundActive text-codinit-elements-textPrimary border border-codinit-elements-borderColor" + /> - + className="w-8 h-8 rounded-md bg-codinit-elements-textPrimary text-codinit-elements-background-depth-1" + />
From c0f9c6f5f87997527226e38b05c574d723da1f68 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 25 Dec 2025 20:59:09 +1100 Subject: [PATCH 087/286] feat: add CodinIT provider integration with Pro feature options support Extend chat validation schema to accept codinit_options for Web Search, Lazy Edits, and file handling. Register CodinIT provider in LLM registry and pass Pro options through the chat API pipeline. --- app/lib/api/chat-validation.ts | 12 ++++++++++++ app/lib/modules/llm/base-provider.ts | 1 + app/lib/modules/llm/registry.ts | 2 ++ app/routes/api.chat.ts | 2 ++ 4 files changed, 17 insertions(+) diff --git a/app/lib/api/chat-validation.ts b/app/lib/api/chat-validation.ts index 836bb8b3..fbe31028 100644 --- a/app/lib/api/chat-validation.ts +++ b/app/lib/api/chat-validation.ts @@ -31,6 +31,13 @@ const chatRequestSchema = z.object({ designScheme: z.any().optional(), supabase: supabaseConfigSchema.optional(), enableMCPTools: z.boolean().default(false), + codinit_options: z + .object({ + enable_web_search: z.boolean().optional(), + enable_lazy_edits: z.boolean().optional(), + files: z.boolean().optional(), + }) + .optional(), }); export interface ValidatedChatRequest { @@ -48,6 +55,11 @@ export interface ValidatedChatRequest { }; }; enableMCPTools: boolean; + codinit_options?: { + enable_web_search?: boolean; + enable_lazy_edits?: boolean; + files?: boolean; + }; } export function validateChatRequest(data: unknown): ValidatedChatRequest { diff --git a/app/lib/modules/llm/base-provider.ts b/app/lib/modules/llm/base-provider.ts index 981c3682..80f838c0 100644 --- a/app/lib/modules/llm/base-provider.ts +++ b/app/lib/modules/llm/base-provider.ts @@ -154,6 +154,7 @@ export abstract class BaseProvider implements ProviderInfo { serverEnv?: Env; apiKeys?: Record; providerSettings?: Record; + codinit_options?: any; }): LanguageModelV1; } diff --git a/app/lib/modules/llm/registry.ts b/app/lib/modules/llm/registry.ts index df31b1cf..07710b2e 100644 --- a/app/lib/modules/llm/registry.ts +++ b/app/lib/modules/llm/registry.ts @@ -1,4 +1,5 @@ import AnthropicProvider from './providers/anthropic'; +import CodinITProvider from './providers/codinit'; import DeepseekProvider from './providers/deepseek'; import GoogleProvider from './providers/google'; import GroqProvider from './providers/groq'; @@ -19,6 +20,7 @@ import GithubProvider from './providers/github'; export { AnthropicProvider, + CodinITProvider, DeepseekProvider, GoogleProvider, GroqProvider, diff --git a/app/routes/api.chat.ts b/app/routes/api.chat.ts index 0c9e8e0d..06f08cc4 100644 --- a/app/routes/api.chat.ts +++ b/app/routes/api.chat.ts @@ -276,6 +276,7 @@ async function chatAction({ context, request }: ActionFunctionArgs) { summary, messageSliceId, designScheme, + codinit_options: validatedRequest.codinit_options, }); stream.switchSource(result.toDataStream()); @@ -361,6 +362,7 @@ async function chatAction({ context, request }: ActionFunctionArgs) { summary, messageSliceId, designScheme, + codinit_options: validatedRequest.codinit_options, }); (async () => { From e96b8b5e87d51eda0c053bd94719e429425072a6 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 25 Dec 2025 20:59:39 +1100 Subject: [PATCH 088/286] refactor: migrate hardcoded colors to CSS variables and optimize diff view styling Replace rgba borders with CSS custom properties in code.scss. Remove Tailwind utilities from diff-view.css in favor of vanilla CSS for better performance. Revert icon color overrides and reduce header height to 48px in variables.scss. --- app/styles/components/code.scss | 4 +- app/styles/diff-view.css | 44 ++++-- app/styles/variables.scss | 236 ++++++++++++++++++++------------ 3 files changed, 187 insertions(+), 97 deletions(-) diff --git a/app/styles/components/code.scss b/app/styles/components/code.scss index a1a16e39..536596b0 100644 --- a/app/styles/components/code.scss +++ b/app/styles/components/code.scss @@ -1,11 +1,11 @@ .actions .shiki { background-color: var(--codinit-elements-actions-code-background) !important; - border: 1px solid rgba(153, 153, 153, 0.1) !important; /* Neutral border */ + border: 1px solid var(--codinit-elements-borderColor) !important; } .shiki { &:not(:has(.actions), .actions *, .mcp-tool-invocation-code *) { background-color: var(--codinit-elements-messages-code-background) !important; - border: 1px solid rgba(153, 153, 153, 0.08) !important; /* Neutral border */ + border: 1px solid var(--codinit-elements-borderColor) !important; } } diff --git a/app/styles/diff-view.css b/app/styles/diff-view.css index accc9129..a135a2af 100644 --- a/app/styles/diff-view.css +++ b/app/styles/diff-view.css @@ -33,40 +33,62 @@ /* Estilos para as linhas de diff */ .diff-block-added { - @apply bg-green-500/20 border-l-4 border-green-500; + background-color: rgba(34, 197, 94, 0.2); + border-left: 4px solid rgb(34, 197, 94); } .diff-block-removed { - @apply bg-red-500/20 border-l-4 border-red-500; + background-color: rgba(239, 68, 68, 0.2); + border-left: 4px solid rgb(239, 68, 68); } /* Melhorar contraste para mudanças */ -.diff-panel-content .group:hover .diff-block-added { - @apply bg-green-500/30; +.diff-panel-content .diff-line:hover .diff-block-added { + background-color: rgba(34, 197, 94, 0.3); } -.diff-panel-content .group:hover .diff-block-removed { - @apply bg-red-500/30; +.diff-panel-content .diff-line:hover .diff-block-removed { + background-color: rgba(239, 68, 68, 0.3); } /* Estilos unificados para ambas as visualizações */ .diff-line { - @apply flex group min-w-fit transition-colors duration-150; + display: flex; + min-width: fit-content; + transition: background-color 150ms ease; } .diff-line-number { - @apply w-12 shrink-0 pl-2 py-0.5 text-left font-mono text-codinit-elements-textTertiary border-r border-codinit-elements-borderColor bg-codinit-elements-background-depth-1; + width: 3rem; + flex-shrink: 0; + padding: 0.125rem 0 0.125rem 0.5rem; + text-align: left; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + color: var(--codinit-elements-textTertiary); + border-right: 1px solid var(--codinit-elements-borderColor); + background-color: var(--codinit-elements-background-depth-1); } .diff-line-content { - @apply px-4 py-0.5 font-mono whitespace-pre flex-1 group-hover:bg-codinit-elements-background-depth-2 text-codinit-elements-textPrimary; + padding: 0.125rem 1rem; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + white-space: pre; + flex: 1; + color: var(--codinit-elements-textPrimary); + transition: background-color 150ms ease; +} + +.diff-line:hover .diff-line-content { + background-color: var(--codinit-elements-background-depth-2); } /* Cores específicas para adições/remoções */ .diff-added { - @apply bg-green-500/20 border-l-4 border-green-500; + background-color: rgba(34, 197, 94, 0.2); + border-left: 4px solid rgb(34, 197, 94); } .diff-removed { - @apply bg-red-500/20 border-l-4 border-red-500; + background-color: rgba(239, 68, 68, 0.2); + border-left: 4px solid rgb(239, 68, 68); } diff --git a/app/styles/variables.scss b/app/styles/variables.scss index 2969df1f..eaa5c0e4 100644 --- a/app/styles/variables.scss +++ b/app/styles/variables.scss @@ -62,9 +62,9 @@ --codinit-elements-icon-success: theme('colors.green.500'); --codinit-elements-icon-error: theme('colors.red.500'); - --codinit-elements-icon-primary: #cccccc; /* Changed from theme('colors.gray.950') to low-contrast gray */ - --codinit-elements-icon-secondary: #a0a0a0; /* Changed from theme('colors.gray.600') to dimmer gray */ - --codinit-elements-icon-tertiary: #888888; /* Changed from theme('colors.gray.500') to softer gray */ + --codinit-elements-icon-primary: theme('colors.gray.950'); + --codinit-elements-icon-secondary: theme('colors.gray.600'); + --codinit-elements-icon-tertiary: theme('colors.gray.500'); --codinit-elements-dividerColor: theme('colors.gray.100'); @@ -136,13 +136,19 @@ :root, :root[data-theme='dark'] { /* Pure neutral gray with blue accents - improved contrast */ - --codinit-elements-borderColor: #3a3a3a; /* Neutral gray border - slightly lighter for visibility */ - --codinit-elements-borderColorActive: #3b82f6; /* Blue active border */ - - --codinit-elements-bg-depth-1: #121212; /* Main background - darker base */ - --codinit-elements-bg-depth-2: #1a1a1a; /* Content surfaces */ - --codinit-elements-bg-depth-3: #242424; /* Distinction elements */ - --codinit-elements-bg-depth-4: #2e2e2e; /* Buttons/inputs - more contrast */ + --codinit-elements-borderColor: #3a3a3a; + /* Neutral gray border - slightly lighter for visibility */ + --codinit-elements-borderColorActive: #3b82f6; + /* Blue active border */ + + --codinit-elements-bg-depth-1: #121212; + /* Main background - darker base */ + --codinit-elements-bg-depth-2: #1a1a1a; + /* Content surfaces */ + --codinit-elements-bg-depth-3: #242424; + /* Distinction elements */ + --codinit-elements-bg-depth-4: #2e2e2e; + /* Buttons/inputs - more contrast */ /* Aliases for background-depth variables */ --codinit-elements-background-depth-1: var(--codinit-elements-bg-depth-1); @@ -151,21 +157,31 @@ --codinit-elements-background-depth-4: var(--codinit-elements-bg-depth-4); /* Optimized contrast for text */ - --codinit-elements-textPrimary: #ffffff; /* Pure white for better readability */ - --codinit-elements-textSecondary: #cccccc; /* Neutral gray */ - --codinit-elements-textTertiary: #999999; /* Muted neutral */ - - --codinit-elements-code-background: #0a0a0a; /* Dark code background */ - --codinit-elements-code-text: #f0f6fc; /* Bright code text */ + --codinit-elements-textPrimary: #ffffff; + /* Pure white for better readability */ + --codinit-elements-textSecondary: #cccccc; + /* Neutral gray */ + --codinit-elements-textTertiary: #999999; + /* Muted neutral */ + + --codinit-elements-code-background: #0a0a0a; + /* Dark code background */ + --codinit-elements-code-text: #f0f6fc; + /* Bright code text */ /* Primary Button - Blue accent */ - --codinit-elements-button-primary-background: #3b82f6; /* Blue background */ - --codinit-elements-button-primary-backgroundHover: #2563eb; /* Darker blue on hover */ - --codinit-elements-button-primary-text: #ffffff; /* White text for max contrast */ + --codinit-elements-button-primary-background: #3b82f6; + /* Blue background */ + --codinit-elements-button-primary-backgroundHover: #2563eb; + /* Darker blue on hover */ + --codinit-elements-button-primary-text: #ffffff; + /* White text for max contrast */ /* Secondary Button - Neutral gray with better contrast */ - --codinit-elements-button-secondary-background: #2e2e2e; /* Matches depth-4 for visibility on containers */ - --codinit-elements-button-secondary-backgroundHover: #3a3a3a; /* Lighter hover for clear feedback */ + --codinit-elements-button-secondary-background: #2e2e2e; + /* Matches depth-4 for visibility on containers */ + --codinit-elements-button-secondary-backgroundHover: #3a3a3a; + /* Lighter hover for clear feedback */ --codinit-elements-button-secondary-text: #e0e0e0; /* Danger Button - Remains prominent */ @@ -175,21 +191,30 @@ /* Item backgrounds and content - neutral gray with improved contrast */ --codinit-elements-item-contentDefault: #a0a0a0; - --codinit-elements-item-contentActive: #ffffff; /* White for active */ - --codinit-elements-item-contentAccent: #d0d0d0; /* Neutral gray accent */ - --codinit-elements-item-contentDanger: #f85149; /* Remains prominent */ - --codinit-elements-item-backgroundDefault: transparent; /* Transparent for layering */ - --codinit-elements-item-backgroundActive: #2e2e2e; /* Matches depth-4 for clear hover/active */ - --codinit-elements-item-backgroundAccent: rgba(204, 204, 204, 0.08); /* Subtle neutral accent background */ + --codinit-elements-item-contentActive: #ffffff; + /* White for active */ + --codinit-elements-item-contentAccent: #d0d0d0; + /* Neutral gray accent */ + --codinit-elements-item-contentDanger: #f85149; + /* Remains prominent */ + --codinit-elements-item-backgroundDefault: transparent; + /* Transparent for layering */ + --codinit-elements-item-backgroundActive: #2e2e2e; + /* Matches depth-4 for clear hover/active */ + --codinit-elements-item-backgroundAccent: rgba(204, 204, 204, 0.08); + /* Subtle neutral accent background */ --codinit-elements-item-backgroundDanger: rgba(248, 81, 73, 0.1); /* Loader - Higher contrast */ - --codinit-elements-loader-background: rgba(255, 255, 255, 0.1); /* Slightly more opaque */ - --codinit-elements-loader-progress: #79c0ff; /* Brighter progress color */ + --codinit-elements-loader-background: rgba(255, 255, 255, 0.1); + /* Slightly more opaque */ + --codinit-elements-loader-progress: #79c0ff; + /* Brighter progress color */ /* Artifacts - Neutral gray aligned with new depth system */ --codinit-elements-artifacts-background: var(--codinit-elements-bg-depth-1); - --codinit-elements-artifacts-backgroundHover: rgba(255, 255, 255, 0.06); /* Subtle hover */ + --codinit-elements-artifacts-backgroundHover: rgba(255, 255, 255, 0.06); + /* Subtle hover */ --codinit-elements-artifacts-borderColor: var(--codinit-elements-borderColor); --codinit-elements-artifacts-inlineCode-background: var(--codinit-elements-bg-depth-3); --codinit-elements-artifacts-inlineCode-text: #ffffff; @@ -200,87 +225,130 @@ /* Messages - Neutral gray aligned with new depth system */ --codinit-elements-messages-background: var(--codinit-elements-bg-depth-2); - --codinit-elements-messages-linkColor: #d0d0d0; /* Slightly brighter link */ - --codinit-elements-messages-code-background: #0a0a0a; /* Darker code background */ + --codinit-elements-messages-linkColor: #d0d0d0; + /* Slightly brighter link */ + --codinit-elements-messages-code-background: #0a0a0a; + /* Darker code background */ --codinit-elements-messages-inlineCode-background: var(--codinit-elements-bg-depth-3); --codinit-elements-messages-inlineCode-text: var(--codinit-elements-textPrimary); /* Icons - Adjusted for dark theme contrast */ - --codinit-elements-icon-success: #56d364; /* Remains green */ - --codinit-elements-icon-error: #f85149; /* Remains red */ - --codinit-elements-icon-primary: #f0f6fc; /* Bright white */ - --codinit-elements-icon-secondary: #c9d1d9; /* Bright */ - --codinit-elements-icon-tertiary: #8b949e; /* Subtle */ - - --codinit-elements-dividerColor: #333333; /* Aligned with border color */ - - --codinit-elements-prompt-background: rgba(18, 18, 18, 0.85); /* Aligned with depth-1 */ + --codinit-elements-icon-success: #56d364; + /* Remains green */ + --codinit-elements-icon-error: #f85149; + /* Remains red */ + --codinit-elements-icon-primary: #f0f6fc; + /* Bright white */ + --codinit-elements-icon-secondary: #c9d1d9; + /* Bright */ + --codinit-elements-icon-tertiary: #8b949e; + /* Subtle */ + + --codinit-elements-dividerColor: #333333; + /* Aligned with border color */ + + --codinit-elements-prompt-background: rgba(18, 18, 18, 0.85); + /* Aligned with depth-1 */ /* Sidebar - Blue accent */ - --codinit-elements-sidebar-buttonBackgroundDefault: rgba(59, 130, 246, 0.1); /* Blue accent background */ - --codinit-elements-sidebar-buttonBackgroundHover: rgba(59, 130, 246, 0.15); /* Blue hover */ - --codinit-elements-sidebar-buttonText: #3b82f6; /* Blue accent */ + --codinit-elements-sidebar-buttonBackgroundDefault: rgba(59, 130, 246, 0.1); + /* Blue accent background */ + --codinit-elements-sidebar-buttonBackgroundHover: rgba(59, 130, 246, 0.15); + /* Blue hover */ + --codinit-elements-sidebar-buttonText: #3b82f6; + /* Blue accent */ /* Preview Address Bar - Compatible with undertone */ - --codinit-elements-preview-addressBar-background: var( - --codinit-elements-bg-depth-2 - ); /* Use depth-2 for consistency */ - --codinit-elements-preview-addressBar-backgroundHover: rgba(255, 255, 255, 0.05); /* Subtle hover */ - --codinit-elements-preview-addressBar-backgroundActive: var( - --codinit-elements-bg-depth-1 - ); /* Use depth-1 for active */ + --codinit-elements-preview-addressBar-background: var(--codinit-elements-bg-depth-2); + /* Use depth-2 for consistency */ + --codinit-elements-preview-addressBar-backgroundHover: rgba(255, 255, 255, 0.05); + /* Subtle hover */ + --codinit-elements-preview-addressBar-backgroundActive: var(--codinit-elements-bg-depth-1); + /* Use depth-1 for active */ --codinit-elements-preview-addressBar-text: var(--codinit-elements-textSecondary); --codinit-elements-preview-addressBar-textActive: var(--codinit-elements-textPrimary); /* Terminals - Neutral gray */ - --codinit-elements-terminals-background: var(--codinit-elements-bg-depth-1); /* Use depth-1 for terminal background */ - --codinit-elements-terminals-buttonBackground: var(--codinit-elements-bg-depth-3); /* Use depth-3 for buttons */ + --codinit-elements-terminals-background: var(--codinit-elements-bg-depth-1); + /* Use depth-1 for terminal background */ + --codinit-elements-terminals-buttonBackground: var(--codinit-elements-bg-depth-3); + /* Use depth-3 for buttons */ - --codinit-elements-cta-background: var(--codinit-elements-bg-depth-3); /* Use depth-3 for CTA */ + --codinit-elements-cta-background: var(--codinit-elements-bg-depth-3); + /* Use depth-3 for CTA */ --codinit-elements-cta-text: #ffffff; /* Terminal Colors - Pure neutral gray */ - --codinit-terminal-background: var(--codinit-elements-terminals-background); /* Inherit from terminal background */ - --codinit-terminal-foreground: #ffffff; /* Pure white foreground */ - --codinit-terminal-selection-background: rgba(204, 204, 204, 0.2); /* Neutral gray selection */ - --codinit-terminal-black: #000000; /* Pure black */ - --codinit-terminal-red: #ff7b72; /* Brighter red */ - --codinit-terminal-green: #76d974; /* Brighter green */ - --codinit-terminal-yellow: #e2e27a; /* Brighter yellow */ - --codinit-terminal-blue: #63a3ff; /* Brighter blue */ - --codinit-terminal-magenta: #ff79c6; /* Brighter magenta */ - --codinit-terminal-cyan: #98d4ca; /* Brighter cyan */ - --codinit-terminal-white: #ffffff; /* Pure white */ - --codinit-terminal-brightBlack: #555555; /* Neutral gray */ - --codinit-terminal-brightRed: #ff7b72; /* Brighter red */ - --codinit-terminal-brightGreen: #76d974; /* Brighter green */ - --codinit-terminal-brightYellow: #e2e27a; /* Brighter yellow */ - --codinit-terminal-brightBlue: #63a3ff; /* Brighter blue */ - --codinit-terminal-brightMagenta: #ff79c6; /* Brighter magenta */ - --codinit-terminal-brightCyan: #98d4ca; /* Brighter cyan */ - --codinit-terminal-brightWhite: #ffffff; /* Pure white */ - --modern-scrollbar-thumb-background: rgba(153, 153, 153, 0.3); /* Neutral gray thumb */ - --modern-scrollbar-thumb-backgroundHover: rgba(153, 153, 153, 0.5); /* More opaque on hover */ + --codinit-terminal-background: var(--codinit-elements-terminals-background); + /* Inherit from terminal background */ + --codinit-terminal-foreground: #ffffff; + /* Pure white foreground */ + --codinit-terminal-selection-background: rgba(204, 204, 204, 0.2); + /* Neutral gray selection */ + --codinit-terminal-black: #000000; + /* Pure black */ + --codinit-terminal-red: #ff7b72; + /* Brighter red */ + --codinit-terminal-green: #76d974; + /* Brighter green */ + --codinit-terminal-yellow: #e2e27a; + /* Brighter yellow */ + --codinit-terminal-blue: #63a3ff; + /* Brighter blue */ + --codinit-terminal-magenta: #ff79c6; + /* Brighter magenta */ + --codinit-terminal-cyan: #98d4ca; + /* Brighter cyan */ + --codinit-terminal-white: #ffffff; + /* Pure white */ + --codinit-terminal-brightBlack: #555555; + /* Neutral gray */ + --codinit-terminal-brightRed: #ff7b72; + /* Brighter red */ + --codinit-terminal-brightGreen: #76d974; + /* Brighter green */ + --codinit-terminal-brightYellow: #e2e27a; + /* Brighter yellow */ + --codinit-terminal-brightBlue: #63a3ff; + /* Brighter blue */ + --codinit-terminal-brightMagenta: #ff79c6; + /* Brighter magenta */ + --codinit-terminal-brightCyan: #98d4ca; + /* Brighter cyan */ + --codinit-terminal-brightWhite: #ffffff; + /* Pure white */ + --modern-scrollbar-thumb-background: rgba(153, 153, 153, 0.3); + /* Neutral gray thumb */ + --modern-scrollbar-thumb-backgroundHover: rgba(153, 153, 153, 0.5); + /* More opaque on hover */ /* Command/Dialog popover variables - Dark Theme - neutral gray aligned */ - --background: 0 0% 7%; /* #121212 */ + --background: 0 0% 7%; + /* #121212 */ --foreground: 0 0% 98%; - --card: 0 0% 10%; /* #1a1a1a */ + --card: 0 0% 10%; + /* #1a1a1a */ --card-foreground: 0 0% 98%; - --popover: 0 0% 10%; /* #1a1a1a */ + --popover: 0 0% 10%; + /* #1a1a1a */ --popover-foreground: 0 0% 98%; --primary: 217.2 91.2% 59.8%; --primary-foreground: 0 0% 98%; - --secondary: 0 0% 14%; /* #242424 */ + --secondary: 0 0% 14%; + /* #242424 */ --secondary-foreground: 0 0% 98%; - --muted: 0 0% 14%; /* #242424 */ + --muted: 0 0% 14%; + /* #242424 */ --muted-foreground: 0 0% 64%; - --accent: 0 0% 18%; /* #2e2e2e */ + --accent: 0 0% 18%; + /* #2e2e2e */ --accent-foreground: 0 0% 98%; --destructive: 0 62.8% 30.6%; --destructive-foreground: 0 0% 98%; - --border: 0 0% 23%; /* #3a3a3a */ - --input: 0 0% 18%; /* #2e2e2e */ + --border: 0 0% 23%; + /* #3a3a3a */ + --input: 0 0% 18%; + /* #2e2e2e */ --ring: 217.2 91.2% 59.8%; } @@ -290,7 +358,7 @@ * Hierarchy: Element Token -> (Element Token | Color Tokens) -> Primitives */ :root { - --header-height: 54px; + --header-height: 48px; --chat-max-width: 36rem; --chat-min-width: 533px; --workbench-width: min(calc(100% - var(--chat-min-width)), 3000px); From 5676013767f1292bf5a185957ef858373c7a40c2 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 25 Dec 2025 20:59:54 +1100 Subject: [PATCH 089/286] feat: implement Pro subscription state management with API verification Create Nanostores-based pro.ts store for managing Pro tier status, credits, and feature flags. Include API key verification function that communicates with CodinIT backend for user info retrieval. --- app/lib/stores/pro.ts | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 app/lib/stores/pro.ts diff --git a/app/lib/stores/pro.ts b/app/lib/stores/pro.ts new file mode 100644 index 00000000..c145c5d2 --- /dev/null +++ b/app/lib/stores/pro.ts @@ -0,0 +1,77 @@ +import { map } from 'nanostores'; + +export interface ProState { + isPro: boolean; + tier: 'free' | 'pro'; + credits: { + total: number; + used: number; + }; + features: { + webSearch: boolean; + lazyEdits: boolean; + }; +} + +export const proStore = map({ + isPro: false, + tier: 'free', + credits: { + total: 0, + used: 0, + }, + features: { + webSearch: false, + lazyEdits: false, + }, +}); + +export const setProState = (state: Partial) => { + proStore.set({ + ...proStore.get(), + ...state, + }); +}; + +export const toggleFeature = (feature: keyof ProState['features']) => { + const currentState = proStore.get(); + proStore.setKey('features', { + ...currentState.features, + [feature]: !currentState.features[feature], + }); +}; + +export const verifyProKey = async (apiKey: string, baseUrl: string = 'https://api.codinit.dev/v1') => { + try { + const response = await fetch(`${baseUrl}/user/info`, { + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }); + + if (!response.ok) { + throw new Error('Invalid API Key or backend unreachable'); + } + + const data = (await response.json()) as { + tier: 'free' | 'pro'; + totalCredits: number; + usedCredits: number; + }; + + setProState({ + isPro: data.tier === 'pro', + tier: data.tier, + credits: { + total: data.totalCredits, + used: data.usedCredits, + }, + }); + + return data; + } catch (error) { + console.error('Pro verification failed:', error); + setProState({ isPro: false, tier: 'free' }); + throw error; + } +}; From 473800eacf1edde9b46648338eff4d231849ee22 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Thu, 25 Dec 2025 21:00:21 +1100 Subject: [PATCH 090/286] refactor: adjust workbench positioning and remove padding for edge-to-edge layout Align workbench top position with updated header height variable. Remove horizontal padding and add left border for cleaner edge-to-edge design that matches the new header styling. --- app/components/workbench/Workbench.client.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/workbench/Workbench.client.tsx b/app/components/workbench/Workbench.client.tsx index 22dc2a47..5d413522 100644 --- a/app/components/workbench/Workbench.client.tsx +++ b/app/components/workbench/Workbench.client.tsx @@ -134,7 +134,7 @@ export const Workbench = memo( >
-
-
+
+
Date: Thu, 25 Dec 2025 21:39:49 +1100 Subject: [PATCH 091/286] added browser mapping --- app/components/chat/Chatbox.tsx | 2 +- package.json | 1 + pnpm-lock.yaml | 11 +++++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/components/chat/Chatbox.tsx b/app/components/chat/Chatbox.tsx index e84ff87f..f9d16b4e 100644 --- a/app/components/chat/Chatbox.tsx +++ b/app/components/chat/Chatbox.tsx @@ -430,7 +430,7 @@ export const ChatBox: React.FC = (props) => { )} onClick={() => { if (props.provider?.name !== 'CodinIT') { - toast.info('Web Search is a Pro feature available with CodinIT Pro provider.'); + toast.info('Web Search is a Pro feature coming soon...'); return; } diff --git a/package.json b/package.json index 30a59ef9..9200edd9 100644 --- a/package.json +++ b/package.json @@ -191,6 +191,7 @@ "@types/react-window": "^1.8.8", "@vitejs/plugin-react": "^4.7.0", "@vitest/browser": "^3.1.0", + "baseline-browser-mapping": "^2.9.11", "concurrently": "^8.2.2", "cross-env": "^7.0.3", "electron": "^35.7.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 01badcd3..5a3f685e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -437,6 +437,9 @@ importers: '@vitest/browser': specifier: ^3.1.0 version: 3.2.4(playwright@1.56.1)(vite@5.4.21(@types/node@22.18.12)(sass-embedded@1.93.2)(sass@1.93.2))(vitest@3.2.4) + baseline-browser-mapping: + specifier: ^2.9.11 + version: 2.9.11 concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -4134,8 +4137,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.20: - resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==} + baseline-browser-mapping@2.9.11: + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true basic-auth@2.0.1: @@ -12963,7 +12966,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.20: {} + baseline-browser-mapping@2.9.11: {} basic-auth@2.0.1: dependencies: @@ -13094,7 +13097,7 @@ snapshots: browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.20 + baseline-browser-mapping: 2.9.11 caniuse-lite: 1.0.30001751 electron-to-chromium: 1.5.240 node-releases: 2.0.26 From 1fccf5a813a40240302163cd1bdb0d9baf6145a1 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 26 Dec 2025 19:05:09 +1100 Subject: [PATCH 092/286] redesign artifact component with modernized card layout and improved animations --- app/components/chat/Artifact.tsx | 129 +++++++++++++++---------------- 1 file changed, 62 insertions(+), 67 deletions(-) diff --git a/app/components/chat/Artifact.tsx b/app/components/chat/Artifact.tsx index b30a7318..a099b222 100644 --- a/app/components/chat/Artifact.tsx +++ b/app/components/chat/Artifact.tsx @@ -78,82 +78,77 @@ export const Artifact = memo(({ messageId }: ArtifactProps) => { : artifact?.title; return ( - <> -
-
- - {artifact.type !== 'bundled' &&
} - - {actions.length && artifact.type !== 'bundled' && ( +
+ Click to open Webview +
+
+ + + {actions.length > 0 && artifact.type !== 'bundled' && ( + <> +
+
-
-
-
+
+
+ + )} +
+ + {artifact.type === 'bundled' && ( +
+
+ {allActionFinished ? ( +
+ ) : ( +
)} - +
+
+ {allActionFinished + ? artifact.id === 'restored-project-setup' + ? 'Restore files from snapshot' + : 'Initial files created' + : 'Creating initial files'} +
- {artifact.type === 'bundled' && ( -
-
- {allActionFinished ? ( -
- ) : ( -
- )} -
-
- {/* This status text remains the same */} - {allActionFinished - ? artifact.id === 'restored-project-setup' - ? 'Restore files from snapshot' - : 'Initial files created' - : 'Creating initial files'} + )} + + + {artifact.type !== 'bundled' && showActions && actions.length > 0 && ( + +
+
-
+ )} - - {artifact.type !== 'bundled' && showActions && actions.length > 0 && ( - -
- -
- -
- - )} - -
- +
+
); }); From 90f6f5ec5f9871963a59aa4dd9c77f6f92cc5c25 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 26 Dec 2025 19:05:11 +1100 Subject: [PATCH 093/286] simplify shadow gradient and clean up spacing in base chat styles --- app/components/chat/BaseChat.module.scss | 43 +++++++----------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/app/components/chat/BaseChat.module.scss b/app/components/chat/BaseChat.module.scss index 694afef9..72dd0736 100644 --- a/app/components/chat/BaseChat.module.scss +++ b/app/components/chat/BaseChat.module.scss @@ -47,25 +47,10 @@ } ._Shadow_8mvus_1 { - background: linear-gradient( - to top, - var(--codinit-elements-bg-depth-1) 0%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 98.7%, transparent) 8.1%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 95.1%, transparent) 15.5%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 89.6%, transparent) 22.5%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 82.5%, transparent) 29%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 74.1%, transparent) 35.3%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 64.8%, transparent) 41.2%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 55%, transparent) 47.1%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 45%, transparent) 52.9%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 35.2%, transparent) 58.8%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 25.9%, transparent) 64.7%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 17.5%, transparent) 71%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 10.4%, transparent) 77.5%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 4.9%, transparent) 84.5%, - color-mix(in srgb, var(--codinit-elements-bg-depth-1) 1.3%, transparent) 91.9%, - transparent 100% - ); + background: linear-gradient(to bottom, + var(--codinit-elements-bg-depth-1) 0%, + transparent 100%); + height: 24px; } *:has(+ ._StickyPinnedMessage_rq7xp_1) { @@ -104,7 +89,7 @@ margin-block-end: 16px; } -._MigrationSummary_1ebkv_1 ul li > ul { +._MigrationSummary_1ebkv_1 ul li>ul { margin-block-start: 4px; padding-left: 0.75rem; } @@ -116,7 +101,7 @@ margin-block-end: 6px; } -._MigrationSummary_1ebkv_1 ol + ul { +._MigrationSummary_1ebkv_1 ol+ul { padding-left: 2rem; } @@ -268,14 +253,12 @@ transform: translate(-50%); height: 2px; width: 100px; - background: linear-gradient( - 90deg, - transparent 0%, - var(--codinit-elements-borderColor) 20%, - var(--codinit-elements-textPrimary) 50%, - var(--codinit-elements-borderColor) 80%, - transparent 100% - ); + background: linear-gradient(90deg, + transparent 0%, + var(--codinit-elements-borderColor) 20%, + var(--codinit-elements-textPrimary) 50%, + var(--codinit-elements-borderColor) 80%, + transparent 100%); opacity: 0.6; transition: opacity 0.6s cubic-bezier(0.32, 0.72, 0, 1), @@ -376,4 +359,4 @@ opacity: 1; transform: translateY(0); } -} +} \ No newline at end of file From 405548c7860476655d44b9819dba3f6c06aef4a7 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 26 Dec 2025 19:05:17 +1100 Subject: [PATCH 094/286] implement animated workbench header with synchronized width transitions --- app/components/chat/BaseChat.tsx | 133 ++++++++++++++++++------------- 1 file changed, 77 insertions(+), 56 deletions(-) diff --git a/app/components/chat/BaseChat.tsx b/app/components/chat/BaseChat.tsx index 5273377c..363a4401 100644 --- a/app/components/chat/BaseChat.tsx +++ b/app/components/chat/BaseChat.tsx @@ -6,6 +6,8 @@ import type { JSONValue, Message } from 'ai'; import React, { lazy, Suspense, type RefCallback, useEffect, useState } from 'react'; import { ClientOnly } from 'remix-utils/client-only'; import { Menu } from '~/components/sidebar/Menu.client'; +import { motion } from 'framer-motion'; +import { cubicEasingFn } from '~/utils/easings'; const Workbench = lazy(() => import('~/components/workbench/Workbench.client').then((module) => ({ @@ -447,69 +449,88 @@ export const BaseChat = React.forwardRef( > {() => } - {/* Unified Header Container - spans full width */} {chatStarted && (
- {/* Chat Header Section - constrained to chat width */} -
+ {/* Chat Header Section - Syncs with Chat Panel */} +
- {/* Workbench Header Section - fills remaining space */} -
- {selectedView === 'code' && ( - { - workbenchStore.downloadZip(); + {/* Workbench Header Section - Syncs with Workbench Panel */} + + {() => ( + setIsSyncing(true)} - onPushToGitHub={() => setIsPushDialogOpen(true)} - isSyncing={isSyncing} - setIsPushDialogOpen={setIsPushDialogOpen} - /> - )} - - {selectedView === 'preview' && ( - - )} - - {selectedView === 'diff' && selectedFile && currentDocument && ( - setIsDiffFullscreen(!isDiffFullscreen)} - /> + className="overflow-hidden" + > +
+ {selectedView === 'code' && ( + { + workbenchStore.downloadZip(); + }} + onSyncFiles={() => setIsSyncing(true)} + onPushToGitHub={() => setIsPushDialogOpen(true)} + isSyncing={isSyncing} + setIsPushDialogOpen={setIsPushDialogOpen} + /> + )} + + {selectedView === 'preview' && ( + + )} + + {selectedView === 'diff' && selectedFile && currentDocument && ( + setIsDiffFullscreen(!isDiffFullscreen)} + /> + )} +
+
)} -
+
)} From 197b2701c8eb450c3f040c12c72495212757702d Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 26 Dec 2025 19:05:20 +1100 Subject: [PATCH 095/286] integrate Pro subscription state in chat API requests --- app/components/chat/Chat.client.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/components/chat/Chat.client.tsx b/app/components/chat/Chat.client.tsx index 18addabb..6f40a10c 100644 --- a/app/components/chat/Chat.client.tsx +++ b/app/components/chat/Chat.client.tsx @@ -28,6 +28,7 @@ import type { DesignScheme } from '~/types/design-scheme'; import type { ElementInfo } from '~/components/workbench/Inspector'; import type { TextUIPart, FileUIPart, Attachment } from '@ai-sdk/ui-utils'; import { useMCPStore } from '~/lib/stores/mcp'; +import { proStore } from '~/lib/stores/pro'; import type { LlmErrorAlertType } from '~/types/actions'; const logger = createScopedLogger('Chat'); @@ -140,6 +141,7 @@ export const ChatImpl = memo( } = useChat({ api: '/api/chat', body: { + isPro: proStore.get().isPro, apiKeys, files, promptId, From 6c44ad4ba9c9ce6097cedacf593b3d772b06d2e2 Mon Sep 17 00:00:00 2001 From: Gerome-Elassaad Date: Fri, 26 Dec 2025 19:05:23 +1100 Subject: [PATCH 096/286] reorganize chatbox layout with send button positioned in bottom toolbar --- app/components/chat/Chatbox.tsx | 48 ++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/components/chat/Chatbox.tsx b/app/components/chat/Chatbox.tsx index f9d16b4e..1d85aa58 100644 --- a/app/components/chat/Chatbox.tsx +++ b/app/components/chat/Chatbox.tsx @@ -179,7 +179,7 @@ export const ChatBox: React.FC = (props) => { <>
= (props) => {