← vibesdk
worker/api/controllers/capabilities/controller.ts
2.1 KB
Download file
/**
* Capabilities Controller
*
* Exposes platform capabilities including available features and their configurations.
* This endpoint allows the frontend to dynamically discover what features are available
* on this platform instance.
*/
import { BaseController } from '../baseController';
import type { ApiResponse, ControllerResponse } from '../types';
import type { RouteContext } from '../../types/route-context';
import type { CapabilitiesData } from './types';
import type { FeatureDefinition, PlatformCapabilities } from '../../../agents/core/features/types';
import { DEFAULT_FEATURE_DEFINITIONS } from '../../../agents/core/features';
import { createLogger } from '../../../logger';
const logger = createLogger('CapabilitiesController');
export class CapabilitiesController extends BaseController {
/**
* Get platform capabilities
*
* Returns the list of available features and their capabilities.
* Feature availability is controlled by PLATFORM_CAPABILITIES in wrangler.jsonc.
*
* @route GET /api/capabilities
* @access Public
*/
static async getCapabilities(
_request: Request,
env: Env,
_ctx: ExecutionContext,
_context: RouteContext,
): Promise<ControllerResponse<ApiResponse<CapabilitiesData>>> {
const config = env.PLATFORM_CAPABILITIES;
// Build feature list by merging defaults with enabled status from config
const features: FeatureDefinition[] = [
{ ...DEFAULT_FEATURE_DEFINITIONS.app, enabled: config.features.app.enabled },
{ ...DEFAULT_FEATURE_DEFINITIONS.presentation, enabled: config.features.presentation.enabled },
{ ...DEFAULT_FEATURE_DEFINITIONS.general, enabled: config.features.general.enabled },
];
const capabilities: PlatformCapabilities = {
features,
version: config.version,
userAccountDeploy: env.ENABLE_USER_ACCOUNT_DEPLOY === 'true',
artifacts: env.ENABLE_ARTIFACTS === 'true',
};
logger.info('Returning platform capabilities', {
enabledFeatures: features.filter((f) => f.enabled).map((f) => f.id),
version: capabilities.version,
});
return CapabilitiesController.createSuccessResponse(capabilities);
}
}