mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-04 09:13:08 +00:00
feat: Integrate CursorProvider into ProviderFactory
- Added CursorProvider to the ProviderFactory for handling cursor-* models. - Updated getProviderNameForModel method to determine the appropriate provider based on model identifiers. - Enhanced getAllProviders method to return both ClaudeProvider and CursorProvider. - Updated documentation to reflect the completion of the Provider Factory integration phase.
This commit is contained in:
23
apps/server/src/providers/index.ts
Normal file
23
apps/server/src/providers/index.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Provider exports
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Base provider
|
||||||
|
export { BaseProvider } from './base-provider.js';
|
||||||
|
export type {
|
||||||
|
ProviderConfig,
|
||||||
|
ExecuteOptions,
|
||||||
|
ProviderMessage,
|
||||||
|
InstallationStatus,
|
||||||
|
ModelDefinition,
|
||||||
|
} from './types.js';
|
||||||
|
|
||||||
|
// Claude provider
|
||||||
|
export { ClaudeProvider } from './claude-provider.js';
|
||||||
|
|
||||||
|
// Cursor provider
|
||||||
|
export { CursorProvider, CursorErrorCode, CursorError } from './cursor-provider.js';
|
||||||
|
export { CursorConfigManager } from './cursor-config-manager.js';
|
||||||
|
|
||||||
|
// Provider factory
|
||||||
|
export { ProviderFactory } from './provider-factory.js';
|
||||||
@@ -8,33 +8,56 @@
|
|||||||
|
|
||||||
import { BaseProvider } from './base-provider.js';
|
import { BaseProvider } from './base-provider.js';
|
||||||
import { ClaudeProvider } from './claude-provider.js';
|
import { ClaudeProvider } from './claude-provider.js';
|
||||||
import type { InstallationStatus } from './types.js';
|
import { CursorProvider } from './cursor-provider.js';
|
||||||
|
import type { InstallationStatus, ModelDefinition } from './types.js';
|
||||||
|
import { CURSOR_MODEL_MAP } from '@automaker/types';
|
||||||
|
|
||||||
export class ProviderFactory {
|
export class ProviderFactory {
|
||||||
|
/**
|
||||||
|
* Determine which provider to use for a given model
|
||||||
|
*
|
||||||
|
* @param model Model identifier
|
||||||
|
* @returns Provider name ('claude' | 'cursor')
|
||||||
|
*/
|
||||||
|
static getProviderNameForModel(model: string): 'claude' | 'cursor' {
|
||||||
|
const lowerModel = model.toLowerCase();
|
||||||
|
|
||||||
|
// Check for explicit cursor prefix
|
||||||
|
if (lowerModel.startsWith('cursor-')) {
|
||||||
|
return 'cursor';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if it's a known Cursor model ID (without prefix)
|
||||||
|
const cursorModelId = lowerModel.replace('cursor-', '');
|
||||||
|
if (cursorModelId in CURSOR_MODEL_MAP) {
|
||||||
|
return 'cursor';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for Claude model patterns
|
||||||
|
if (
|
||||||
|
lowerModel.startsWith('claude-') ||
|
||||||
|
['opus', 'sonnet', 'haiku'].some((n) => lowerModel.includes(n))
|
||||||
|
) {
|
||||||
|
return 'claude';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default to Claude
|
||||||
|
return 'claude';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the appropriate provider for a given model ID
|
* Get the appropriate provider for a given model ID
|
||||||
*
|
*
|
||||||
* @param modelId Model identifier (e.g., "claude-opus-4-5-20251101", "gpt-5.2", "cursor-fast")
|
* @param modelId Model identifier (e.g., "claude-opus-4-5-20251101", "cursor-gpt-4o", "cursor-auto")
|
||||||
* @returns Provider instance for the model
|
* @returns Provider instance for the model
|
||||||
*/
|
*/
|
||||||
static getProviderForModel(modelId: string): BaseProvider {
|
static getProviderForModel(modelId: string): BaseProvider {
|
||||||
const lowerModel = modelId.toLowerCase();
|
const providerName = this.getProviderNameForModel(modelId);
|
||||||
|
|
||||||
// Claude models (claude-*, opus, sonnet, haiku)
|
if (providerName === 'cursor') {
|
||||||
if (lowerModel.startsWith('claude-') || ['haiku', 'sonnet', 'opus'].includes(lowerModel)) {
|
return new CursorProvider();
|
||||||
return new ClaudeProvider();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Future providers:
|
|
||||||
// if (lowerModel.startsWith("cursor-")) {
|
|
||||||
// return new CursorProvider();
|
|
||||||
// }
|
|
||||||
// if (lowerModel.startsWith("opencode-")) {
|
|
||||||
// return new OpenCodeProvider();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Default to Claude for unknown models
|
|
||||||
console.warn(`[ProviderFactory] Unknown model prefix for "${modelId}", defaulting to Claude`);
|
|
||||||
return new ClaudeProvider();
|
return new ClaudeProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,10 +65,7 @@ export class ProviderFactory {
|
|||||||
* Get all available providers
|
* Get all available providers
|
||||||
*/
|
*/
|
||||||
static getAllProviders(): BaseProvider[] {
|
static getAllProviders(): BaseProvider[] {
|
||||||
return [
|
return [new ClaudeProvider(), new CursorProvider()];
|
||||||
new ClaudeProvider(),
|
|
||||||
// Future providers...
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,11 +100,8 @@ export class ProviderFactory {
|
|||||||
case 'anthropic':
|
case 'anthropic':
|
||||||
return new ClaudeProvider();
|
return new ClaudeProvider();
|
||||||
|
|
||||||
// Future providers:
|
case 'cursor':
|
||||||
// case "cursor":
|
return new CursorProvider();
|
||||||
// return new CursorProvider();
|
|
||||||
// case "opencode":
|
|
||||||
// return new OpenCodeProvider();
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
@@ -94,15 +111,8 @@ export class ProviderFactory {
|
|||||||
/**
|
/**
|
||||||
* Get all available models from all providers
|
* Get all available models from all providers
|
||||||
*/
|
*/
|
||||||
static getAllAvailableModels() {
|
static getAllAvailableModels(): ModelDefinition[] {
|
||||||
const providers = this.getAllProviders();
|
const providers = this.getAllProviders();
|
||||||
const allModels = [];
|
return providers.flatMap((p) => p.getAvailableModels());
|
||||||
|
|
||||||
for (const provider of providers) {
|
|
||||||
const models = provider.getAvailableModels();
|
|
||||||
allModels.push(...models);
|
|
||||||
}
|
|
||||||
|
|
||||||
return allModels;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
| 0 | [Analysis & Documentation](phases/phase-0-analysis.md) | `completed` | ✅ |
|
| 0 | [Analysis & Documentation](phases/phase-0-analysis.md) | `completed` | ✅ |
|
||||||
| 1 | [Core Types & Configuration](phases/phase-1-types.md) | `completed` | ✅ |
|
| 1 | [Core Types & Configuration](phases/phase-1-types.md) | `completed` | ✅ |
|
||||||
| 2 | [Cursor Provider Implementation](phases/phase-2-provider.md) | `completed` | ✅ |
|
| 2 | [Cursor Provider Implementation](phases/phase-2-provider.md) | `completed` | ✅ |
|
||||||
| 3 | [Provider Factory Integration](phases/phase-3-factory.md) | `pending` | - |
|
| 3 | [Provider Factory Integration](phases/phase-3-factory.md) | `completed` | ✅ |
|
||||||
| 4 | [Setup Routes & Status Endpoints](phases/phase-4-routes.md) | `pending` | - |
|
| 4 | [Setup Routes & Status Endpoints](phases/phase-4-routes.md) | `pending` | - |
|
||||||
| 5 | [Log Parser Integration](phases/phase-5-log-parser.md) | `pending` | - |
|
| 5 | [Log Parser Integration](phases/phase-5-log-parser.md) | `pending` | - |
|
||||||
| 6 | [UI Setup Wizard](phases/phase-6-setup-wizard.md) | `pending` | - |
|
| 6 | [UI Setup Wizard](phases/phase-6-setup-wizard.md) | `pending` | - |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Phase 3: Provider Factory Integration
|
# Phase 3: Provider Factory Integration
|
||||||
|
|
||||||
**Status:** `pending`
|
**Status:** `completed`
|
||||||
**Dependencies:** Phase 2 (Provider)
|
**Dependencies:** Phase 2 (Provider)
|
||||||
**Estimated Effort:** Small (routing logic only)
|
**Estimated Effort:** Small (routing logic only)
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ Integrate CursorProvider into the ProviderFactory so models are automatically ro
|
|||||||
|
|
||||||
### Task 3.1: Update Provider Factory
|
### Task 3.1: Update Provider Factory
|
||||||
|
|
||||||
**Status:** `pending`
|
**Status:** `completed`
|
||||||
|
|
||||||
**File:** `apps/server/src/providers/provider-factory.ts`
|
**File:** `apps/server/src/providers/provider-factory.ts`
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ export class ProviderFactory {
|
|||||||
|
|
||||||
### Task 3.2: Export CursorProvider
|
### Task 3.2: Export CursorProvider
|
||||||
|
|
||||||
**Status:** `pending`
|
**Status:** `completed`
|
||||||
|
|
||||||
**File:** `apps/server/src/providers/index.ts`
|
**File:** `apps/server/src/providers/index.ts`
|
||||||
|
|
||||||
@@ -203,13 +203,13 @@ console.log('Total models:', allModels.length);
|
|||||||
|
|
||||||
Before marking this phase complete:
|
Before marking this phase complete:
|
||||||
|
|
||||||
- [ ] ProviderFactory routes `cursor-*` models to CursorProvider
|
- [x] ProviderFactory routes `cursor-*` models to CursorProvider
|
||||||
- [ ] ProviderFactory routes Claude models to ClaudeProvider
|
- [x] ProviderFactory routes Claude models to ClaudeProvider
|
||||||
- [ ] `getAllProviders()` returns both providers
|
- [x] `getAllProviders()` returns both providers
|
||||||
- [ ] `getProviderByName('cursor')` returns CursorProvider
|
- [x] `getProviderByName('cursor')` returns CursorProvider
|
||||||
- [ ] `checkAllProviders()` returns status for both providers
|
- [x] `checkAllProviders()` returns status for both providers
|
||||||
- [ ] `getAllAvailableModels()` includes Cursor models
|
- [x] `getAllAvailableModels()` includes Cursor models
|
||||||
- [ ] Existing Claude routing not broken
|
- [x] Existing Claude routing not broken
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user