Skip to content
Merged
Show file tree
Hide file tree
Changes from 78 commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
de53b8e
refactor: agent behaviors, objectives generalized, abstracted + agent…
AshishKumar4 Nov 7, 2025
5685c7d
feat: finish most refactor and get it to build
AshishKumar4 Nov 9, 2025
2aea3c7
feat: add ai-based project type detection and workflow support
AshishKumar4 Nov 10, 2025
e8d07af
fix: template initialization
AshishKumar4 Nov 10, 2025
40ab40e
fix: wire up onConnect to coding agent
AshishKumar4 Nov 10, 2025
740bf1c
feat: improve GitHub Actions workflow reliability
AshishKumar4 Nov 10, 2025
a25e72f
refactor: improve type safety in state migration logic
AshishKumar4 Nov 10, 2025
bb09d92
fix: add optional chaining to prevent runtime errors in blueprint ren…
AshishKumar4 Nov 10, 2025
5e4ebb2
feat: general agent
AshishKumar4 Nov 11, 2025
1faaca1
refactor: reorganize project builder architecture + sandbox templatel…
AshishKumar4 Nov 11, 2025
f5a3be6
feat: add project mode selector with agentic behavior support
AshishKumar4 Nov 11, 2025
feca8ca
fix: files format
AshishKumar4 Nov 11, 2025
bb23e88
fix: ensure workspace directory exists before writing files
AshishKumar4 Nov 11, 2025
234860f
feat: replace template manager with ai template selector
AshishKumar4 Nov 11, 2025
97bc622
refactor: integrate conversation history and sync for agentic builder
AshishKumar4 Nov 12, 2025
060cc9e
fix: template import and state init
AshishKumar4 Nov 12, 2025
5deea6a
fix: template cache clear before import + init meta in behavior const…
AshishKumar4 Nov 12, 2025
bbf1979
fix: ui and convo state management
AshishKumar4 Nov 12, 2025
d45f368
fix: convo id uniqueness and improve message deduplication
AshishKumar4 Nov 12, 2025
868ba34
fix: ui auto focus, preview hiding and blueprints
AshishKumar4 Nov 12, 2025
be72055
feat: add completion detection and dependency-aware tool execution
AshishKumar4 Nov 16, 2025
219d2c7
feat: add completion detection and loop prevention to agentic builder…
AshishKumar4 Nov 16, 2025
51f922f
Merge pull request #238 from cloudflare/feat/tool-calling-revamp
AshishKumar4 Nov 17, 2025
06d9ce9
feat: use agentic builder directly for handling user messages
AshishKumar4 Nov 17, 2025
0bfcdbb
feat: presentation specific prompts + prompts restructuring
AshishKumar4 Nov 17, 2025
c479831
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Nov 17, 2025
08d2fc7
refactor: agent behaviors, objectives generalized, abstracted + agent…
AshishKumar4 Nov 7, 2025
d2a7e02
feat: finish most refactor and get it to build
AshishKumar4 Nov 9, 2025
f753f8b
feat: add ai-based project type detection and workflow support
AshishKumar4 Nov 10, 2025
7db6ca2
fix: template initialization
AshishKumar4 Nov 10, 2025
318f6e2
fix: wire up onConnect to coding agent
AshishKumar4 Nov 10, 2025
1e49bb3
feat: improve GitHub Actions workflow reliability
AshishKumar4 Nov 10, 2025
8210b9f
refactor: improve type safety in state migration logic
AshishKumar4 Nov 10, 2025
2a2d86c
fix: add optional chaining to prevent runtime errors in blueprint ren…
AshishKumar4 Nov 10, 2025
45eb5c0
feat: general agent
AshishKumar4 Nov 11, 2025
7ba6257
refactor: reorganize project builder architecture + sandbox templatel…
AshishKumar4 Nov 11, 2025
b34c707
feat: add project mode selector with agentic behavior support
AshishKumar4 Nov 11, 2025
da31e76
fix: files format
AshishKumar4 Nov 11, 2025
17258f3
fix: ensure workspace directory exists before writing files
AshishKumar4 Nov 11, 2025
ca8e7e4
feat: replace template manager with ai template selector
AshishKumar4 Nov 11, 2025
bb1dc96
refactor: integrate conversation history and sync for agentic builder
AshishKumar4 Nov 12, 2025
9f5f787
fix: template import and state init
AshishKumar4 Nov 12, 2025
c6a329e
fix: template cache clear before import + init meta in behavior const…
AshishKumar4 Nov 12, 2025
0323c7a
fix: ui and convo state management
AshishKumar4 Nov 12, 2025
d4ae61d
fix: convo id uniqueness and improve message deduplication
AshishKumar4 Nov 12, 2025
cfe24e3
fix: ui auto focus, preview hiding and blueprints
AshishKumar4 Nov 12, 2025
0f85a7d
feat: add completion detection and dependency-aware tool execution
AshishKumar4 Nov 16, 2025
e926e18
feat: add completion detection and loop prevention to agentic builder…
AshishKumar4 Nov 16, 2025
681bbbe
feat: use agentic builder directly for handling user messages
AshishKumar4 Nov 17, 2025
b6abaca
feat: presentation specific prompts + prompts restructuring
AshishKumar4 Nov 17, 2025
cca8778
refactor: unify template schemas
AshishKumar4 Nov 21, 2025
a4af6b6
Merge branch 'feat/general-agents' of github.com:cloudflare/orange-bu…
AshishKumar4 Nov 21, 2025
e9a31da
Feat: add presentation and documentation preview modes (#234)
AshishKumar4 Nov 21, 2025
d9a85a8
Reapply "refactor: generalize coding agent to behavior + business; pa…
AshishKumar4 Nov 21, 2025
d80c416
fix: cleanup chat.tsx for build
AshishKumar4 Nov 18, 2025
29c890f
Merge branch 'feat/refactor-agents-base' of github.com:cloudflare/ora…
AshishKumar4 Nov 22, 2025
dfec327
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Nov 23, 2025
053fe1c
Merge branch 'feat/refactor-agents-base' of github.com:cloudflare/ora…
AshishKumar4 Nov 23, 2025
00fc51c
feat: agentic streaming presentations finally working
AshishKumar4 Nov 24, 2025
5b96591
fix: preview update fixes + navigation
AshishKumar4 Nov 24, 2025
09653ba
feat: rewrite presentation preview system
AshishKumar4 Nov 25, 2025
ff47fc8
feat: bug fixes + save manifest and slides proactively upon generation
AshishKumar4 Nov 25, 2025
7faf0e0
feat: some prompt improvements in agentic project builder
AshishKumar4 Nov 25, 2025
16c354f
Merge pull request #224 from cloudflare/feat/general-agents
AshishKumar4 Nov 30, 2025
63cd40b
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Nov 30, 2025
4939429
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Nov 30, 2025
f3ab5f5
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Nov 30, 2025
f6f4207
Merge branch 'feat/refactor-agents-base' of github.com:cloudflare/ora…
AshishKumar4 Dec 1, 2025
bf4aa51
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Dec 1, 2025
6f170e1
feat: remove redundant message and fix file saving in code generation
AshishKumar4 Dec 2, 2025
cecb955
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Dec 4, 2025
e3d0862
feat: refactor file manager to separate state recording from git oper…
AshishKumar4 Dec 5, 2025
fa080ec
fix: fix general agent app creation
AshishKumar4 Dec 7, 2025
ce04ec5
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Dec 7, 2025
8044cc3
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Dec 8, 2025
cd2ca6d
refactor: consolidate project objectives into unified base class with…
AshishKumar4 Dec 9, 2025
0534a95
feat: add feature modules and capabilities discovery
AshishKumar4 Dec 9, 2025
4457305
Merge branch 'feat/refactor-agents-base' of github.com:cloudflare/ora…
AshishKumar4 Dec 11, 2025
61421ed
fix: stabilize legacy chats and preview rendering
AshishKumar4 Dec 11, 2025
5318c54
Merge branch nightly
AshishKumar4 Dec 14, 2025
a862c94
test: ignore local cf-git folder in vitest
AshishKumar4 Dec 14, 2025
6fbf28b
refactor: improve ESLint config and fix linting issues across codebase
AshishKumar4 Dec 14, 2025
3e382a1
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Dec 14, 2025
31a1820
fix: improve shell safety and variable handling in claude-reviews gating
AshishKumar4 Dec 14, 2025
3078bd2
chore: update dependencies to latest versions
AshishKumar4 Dec 14, 2025
e414208
Merge branch 'nightly' of github.com:cloudflare/orange-builds into fe…
AshishKumar4 Dec 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 27 additions & 38 deletions .github/workflows/claude-reviews.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ on:
pull_request_review_comment:
types: [created]

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
comprehensive-review:
name: PR Description & Code Review
Expand All @@ -30,6 +34,29 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Delete Previous Claude Comments
run: |
echo "🧹 Deleting previous Claude comments from github-actions bot..."

# Get all comments from github-actions bot containing 'Claude'
CLAUDE_COMMENTS=$(gh api repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments \
--jq '[.[] | select(.user.login == "github-actions[bot]") | select(.body | contains("Claude")) | .id]')

if [ "$CLAUDE_COMMENTS" = "[]" ] || [ -z "$CLAUDE_COMMENTS" ]; then
echo "No previous Claude comments found"
else
echo "Found Claude comments to delete:"
echo "$CLAUDE_COMMENTS" | jq -r '.[]' | while read comment_id; do
echo "Deleting comment $comment_id"
gh api repos/${{ github.repository }}/issues/comments/$comment_id -X DELETE || echo "Failed to delete comment $comment_id"
done
echo "✅ Deleted previous Claude comments"
fi
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
continue-on-error: true

- name: Detect Critical Paths
id: critical_paths
run: |
Expand Down Expand Up @@ -147,41 +174,3 @@ jobs:
--max-turns ${{ steps.critical_paths.outputs.is_critical == 'true' && '90' || '65' }}
--model claude-sonnet-4-5-20250929

- name: Intelligent Comment Cleanup
uses: anthropics/claude-code-action@v1
if: always()
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
Clean up stale bot comments on PR #${{ github.event.pull_request.number }}.

**Task:**
1. Fetch all comments on this PR
2. Identify bot comments (users ending in [bot]) that are stale/outdated:
- Old reviews superseded by newer ones
- Old PR description suggestions
- Previously collapsed/outdated markers
- Progress/status comments from previous workflow runs
3. Keep only the most recent comment per category per bot
4. DELETE all stale comments (do not collapse)

**Get all comments:**
```bash
gh api repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments --jq '.[] | {id, user: .user.login, body, created_at}'
```

**Delete a comment:**
```bash
gh api repos/${{ github.repository }}/issues/comments/COMMENT_ID -X DELETE
```

Be intelligent:
- Preserve the newest useful comment in each category
- Delete everything else that's redundant or stale
- If unsure, keep the comment (conservative approach)

claude_args: |
--allowed-tools "Bash(gh api repos/*/issues/*/comments:*),Bash(gh api repos/*/issues/comments/*:*)"
--max-turns 8
--model claude-haiku-4-5-20251001
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,5 @@ debug-tools/*.json
# Sentry Config File
.env.sentry-build-plugin
data-dump
debug-tools/extracted
debug-tools/extracted
debug-tools/presentation-tester
846 changes: 394 additions & 452 deletions bun.lock

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions commitlint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ export default {
'type-empty': [2, 'never'],
'subject-empty': [2, 'never'],
'subject-full-stop': [2, 'never', '.'],
'header-max-length': [2, 'always', 100],
'header-max-length': [2, 'always', 150],
'body-leading-blank': [1, 'always'],
'body-max-line-length': [2, 'always', 100],
'body-max-line-length': [2, 'always', 200],
'footer-leading-blank': [1, 'always'],
'footer-max-line-length': [2, 'always', 100],
'footer-max-line-length': [2, 'always', 200],
},
};
32 changes: 32 additions & 0 deletions debug-tools/presentation-tester/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"name": "presentation-tester",
"private": true,
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview"
},
"dependencies": {
"react": "^18.3.1",
"react-dom": "^18.3.1",
"fflate": "^0.8.2",
"reveal.js": "^5.1.0",
"sucrase": "^3.35.0",
"framer-motion": "^11.11.17",
"lucide-react": "^0.344.0",
"clsx": "^2.1.1",
"tailwind-merge": "^2.5.4"
},
"devDependencies": {
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react": "^4.3.3",
"typescript": "^5.6.3",
"vite": "^5.4.11",
"tailwindcss": "^3.4.15",
"postcss": "^8.4.49",
"autoprefixer": "^10.4.20"
}
}
1 change: 1 addition & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' blob: https://cdnjs.cloudflare.com https://cdn.tailwindcss.com https://esm.sh; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdnjs.cloudflare.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; connect-src 'self' wss: ws: http: https:; frame-src 'self' http://*.localhost:* https://*;" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Gloria+Hallelujah&family=Caveat:wght@600&display=swap" rel="stylesheet">
Expand Down
14 changes: 13 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
"lint": "eslint .",
"preview": "npm run build && vite preview",
"deploy": "bun --env-file .prod.vars scripts/deploy.ts",
"cli": "tsx --tsconfig tsconfig.app.json cli/index.ts",
"tui": "tsx --tsconfig tsconfig.app.json cli/tui.tsx",
"cf-typegen": "wrangler types --include-runtime false",
"test": "vitest run",
"test:watch": "vitest",
Expand Down Expand Up @@ -77,6 +79,7 @@
"@vitejs/plugin-react": "^5.1.2",
"agents": "^0.2.31",
"class-variance-authority": "^0.7.1",
"cli-table3": "^0.6.5",
"cloudflare": "^4.5.0",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
Expand All @@ -92,6 +95,7 @@
"hono": "^4.10.7",
"html2canvas-pro": "^1.5.13",
"input-otp": "^1.4.2",
"inquirer": "^12.11.1",
"jose": "^5.10.0",
"jsonc-parser": "^3.3.1",
"lucide-react": "^0.541.0",
Expand All @@ -100,6 +104,7 @@
"nanoid": "^5.1.6",
"next-themes": "^0.4.6",
"openai": "^5.23.2",
"ora": "^9.0.0",
"partysocket": "^1.1.6",
"react": "^19.2.1",
"react-day-picker": "^9.12.0",
Expand All @@ -119,6 +124,7 @@
"unified": "^11.0.5",
"vaul": "^1.1.2",
"vite-plugin-svgr": "^4.5.0",
"ws": "^8.18.3",
"zod": "^3.25.76"
},
"devDependencies": {
Expand All @@ -139,6 +145,12 @@
"eslint-plugin-react-refresh": "^0.4.24",
"globals": "^16.5.0",
"husky": "^9.1.7",
"ink": "^6.5.1",
"ink-big-text": "^2.0.0",
"ink-box": "^2.0.0",
"ink-gradient": "^3.0.0",
"ink-spinner": "^5.0.0",
"ink-text-input": "^6.0.0",
"jest": "^29.7.0",
"knip": "^5.72.0",
"prettier-plugin-tailwindcss": "^0.6.14",
Expand All @@ -148,7 +160,7 @@
"typescript-eslint": "^8.49.0",
"vite": "npm:rolldown-vite@7.1.13",
"vitest": "^3.2.4",
"wrangler": "4.45.0"
"wrangler": "4.50.0"
},
"prettier": {
"singleQuote": true,
Expand Down
19 changes: 11 additions & 8 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,22 @@ import { ThemeProvider } from './contexts/theme-context';
import { Toaster } from './components/ui/sonner';
import { AppLayout } from './components/layout/app-layout';
import { ErrorBoundary } from './components/ErrorBoundary';
import { FeatureProvider } from './features';

export default function App() {
return (
<ErrorBoundary>
<ThemeProvider>
<AuthProvider>
<AuthModalProvider>
<AppLayout>
<Outlet />
</AppLayout>
<Toaster richColors position="top-right" />
</AuthModalProvider>
</AuthProvider>
<FeatureProvider>
<AuthProvider>
<AuthModalProvider>
<AppLayout>
<Outlet />
</AppLayout>
<Toaster richColors position="top-right" />
</AuthModalProvider>
</AuthProvider>
</FeatureProvider>
</ThemeProvider>
</ErrorBoundary>
);
Expand Down
50 changes: 43 additions & 7 deletions src/api-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,22 @@ export type {

export type { PlatformStatusData } from 'worker/api/controllers/status/types';

export type { CapabilitiesData } from 'worker/api/controllers/capabilities/types';

export type {
ViewMode,
FeatureCapabilities,
FeatureDefinition,
ViewDefinition,
PlatformCapabilities,
PlatformCapabilitiesConfig,
} from 'worker/agents/core/features/types';

export {
DEFAULT_FEATURE_DEFINITIONS,
getBehaviorTypeForProject,
} from 'worker/agents/core/features';

// Model Config API Types
export type {
ModelConfigsData,
Expand Down Expand Up @@ -106,14 +122,19 @@ export type {
SecretTemplatesData
} from 'worker/api/controllers/secrets/types';

// Agent/CodeGen API Types
// Agent/CodeGen API Types
export type {
AgentConnectionData,
} from 'worker/api/controllers/agent/types';

// Template Types
export type {
TemplateDetails,
} from 'worker/services/sandbox/sandboxTypes';

// WebSocket Types
export type {
WebSocketMessage,
export type {
WebSocketMessage,
WebSocketMessageData,
CodeFixEdits,
ModelConfigsInfoMessage,
Expand All @@ -139,17 +160,24 @@ export type {
} from 'worker/database/types';

// Agent/Generator Types
export type {
export type {
Blueprint as BlueprintType,
PhasicBlueprint,
CodeReviewOutputType,
FileConceptType,
FileOutputType as GeneratedFile,
} from 'worker/agents/schemas';

export type {
CodeGenState
export type {
AgentState,
PhasicState
} from 'worker/agents/core/state';

export type {
BehaviorType,
ProjectType
} from 'worker/agents/core/types';

export type {
ConversationMessage,
} from 'worker/agents/inferutils/common';
Expand All @@ -171,7 +199,7 @@ export type {
export type { RateLimitError } from "worker/services/rate-limit/errors";
export type { AgentPreviewResponse, CodeGenArgs } from 'worker/api/controllers/agent/types';
export type { RateLimitErrorResponse } from 'worker/api/responses';
export { RateLimitExceededError, SecurityError, SecurityErrorType } from 'shared/types/errors';
export { RateLimitExceededError, SecurityError, SecurityErrorType } from '../shared/types/errors.js';

export type { AIModels } from 'worker/agents/inferutils/config.types';
// Model selection types
Expand Down Expand Up @@ -246,6 +274,14 @@ export interface CsrfTokenResponseData {
expiresIn?: number;
}

// CLI Token Response - for CLI authentication
export interface CliTokenData {
token: string;
expiresIn: number;
expiresAt: string;
instructions: string;
}

// Active Sessions Response - matches getUserSessions + isCurrent from controller
export interface ActiveSessionsData {
sessions: Array<{
Expand Down
34 changes: 2 additions & 32 deletions src/components/config-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
import type { AgentDisplayConfig, ModelConfig, UserModelConfigWithMetadata } from '@/api-types';
import { getModelDisplayName, getProviderInfo } from '@/utils/model-helpers';
import type { ModelConfig, UserModelConfigWithMetadata, AgentDisplayConfig } from '@/api-types';

interface ConfigCardProps {
agent: AgentDisplayConfig;
Expand All @@ -15,37 +16,6 @@ interface ConfigCardProps {
isTesting: boolean;
}

// Helper function to get model display name
const getModelDisplayName = (modelValue?: string) => {
if (!modelValue) return 'Default';

return modelValue.split('/').pop() || modelValue;
};

// Helper function to get provider badge info
const getProviderInfo = (modelValue?: string) => {
if (!modelValue) return { name: 'Default', color: 'bg-bg-3 text-text-tertiary' };

// Check specific prefixes first to avoid incorrect matches
if (modelValue.includes('cerebras/')) {
return { name: 'Cerebras', color: 'bg-purple-100 text-purple-800 dark:bg-purple-900/20 dark:text-purple-400' };
}
if (modelValue.includes('[openrouter]')) {
return { name: 'OpenRouter', color: 'bg-pink-100 text-pink-800 dark:bg-pink-900/20 dark:text-pink-400' };
}
if (modelValue.includes('openai/') || modelValue.includes('gpt') || modelValue.includes('o3') || modelValue.includes('o4')) {
return { name: 'OpenAI', color: 'bg-green-100 text-green-800 dark:bg-green-900/20 dark:text-green-400' };
}
if (modelValue.includes('anthropic/') || modelValue.includes('claude')) {
return { name: 'Anthropic', color: 'bg-orange-100 text-orange-800 dark:bg-orange-900/20 dark:text-orange-400' };
}
if (modelValue.includes('google-ai-studio/') || modelValue.includes('gemini')) {
return { name: 'Google', color: 'bg-blue-100 text-blue-800 dark:bg-blue-900/20 dark:text-blue-400' };
}

return { name: 'Custom', color: 'bg-gray-100 text-gray-800 dark:bg-gray-900/20 dark:text-gray-400' };
};

// Helper function to get agent icon based on type
const getAgentIcon = (agentKey: string) => {
if (agentKey.includes('Code') || agentKey.includes('phase') || agentKey.includes('file')) return Code2;
Expand Down
Loading