Подключены runtime API и projects API
Этот коммит содержится в:
+33
-3
@@ -14,13 +14,16 @@ from backend.config_store import (
|
|||||||
)
|
)
|
||||||
from backend.openai_client import OpenAIConfigurationError, ask_ai
|
from backend.openai_client import OpenAIConfigurationError, ask_ai
|
||||||
from backend.project_analyzer import analyze_github_project
|
from backend.project_analyzer import analyze_github_project
|
||||||
|
from backend.projects_api import router as projects_router
|
||||||
|
from backend.runtime_api import router as runtime_router
|
||||||
|
from backend.runtime_logs import add_log
|
||||||
from backend.shell_runner import run_command
|
from backend.shell_runner import run_command
|
||||||
from backend.workspace_api import router as workspace_router
|
from backend.workspace_api import router as workspace_router
|
||||||
|
|
||||||
ROOT_DIR = Path(__file__).resolve().parent.parent
|
ROOT_DIR = Path(__file__).resolve().parent.parent
|
||||||
FRONTEND_DIR = ROOT_DIR / 'frontend'
|
FRONTEND_DIR = ROOT_DIR / 'frontend'
|
||||||
|
|
||||||
app = FastAPI(title='DevConsole', version='0.2.0')
|
app = FastAPI(title='DevConsole', version='0.3.0')
|
||||||
|
|
||||||
app.add_middleware(
|
app.add_middleware(
|
||||||
CORSMiddleware,
|
CORSMiddleware,
|
||||||
@@ -31,6 +34,8 @@ app.add_middleware(
|
|||||||
)
|
)
|
||||||
|
|
||||||
app.include_router(workspace_router)
|
app.include_router(workspace_router)
|
||||||
|
app.include_router(projects_router)
|
||||||
|
app.include_router(runtime_router)
|
||||||
|
|
||||||
if FRONTEND_DIR.exists():
|
if FRONTEND_DIR.exists():
|
||||||
app.mount('/assets', StaticFiles(directory=FRONTEND_DIR / 'assets'), name='assets')
|
app.mount('/assets', StaticFiles(directory=FRONTEND_DIR / 'assets'), name='assets')
|
||||||
@@ -69,7 +74,7 @@ async def workspace_js():
|
|||||||
async def health():
|
async def health():
|
||||||
return {
|
return {
|
||||||
'status': 'ok',
|
'status': 'ok',
|
||||||
'version': '0.2.0',
|
'version': '0.3.0',
|
||||||
'openai_configured': has_openai_key(),
|
'openai_configured': has_openai_key(),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +83,7 @@ async def health():
|
|||||||
async def system_status():
|
async def system_status():
|
||||||
return {
|
return {
|
||||||
'project': 'DevConsole',
|
'project': 'DevConsole',
|
||||||
'version': '0.2.0',
|
'version': '0.3.0',
|
||||||
'status': 'running',
|
'status': 'running',
|
||||||
'openai_configured': has_openai_key(),
|
'openai_configured': has_openai_key(),
|
||||||
'openai_model': get_openai_model(),
|
'openai_model': get_openai_model(),
|
||||||
@@ -96,6 +101,8 @@ async def save_openai_settings(payload: OpenAIConfigRequest):
|
|||||||
set_setting('OPENAI_API_KEY', api_key)
|
set_setting('OPENAI_API_KEY', api_key)
|
||||||
set_setting('OPENAI_MODEL', model)
|
set_setting('OPENAI_MODEL', model)
|
||||||
|
|
||||||
|
add_log('OpenAI settings updated')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True,
|
'success': True,
|
||||||
'message': 'OpenAI settings saved',
|
'message': 'OpenAI settings saved',
|
||||||
@@ -109,11 +116,16 @@ async def test_prompt(payload: PromptTestRequest):
|
|||||||
if not prompt:
|
if not prompt:
|
||||||
raise HTTPException(status_code=400, detail='Prompt is empty')
|
raise HTTPException(status_code=400, detail='Prompt is empty')
|
||||||
|
|
||||||
|
add_log('AI task started')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = await ask_ai(prompt, payload.task_type)
|
result = await ask_ai(prompt, payload.task_type)
|
||||||
except OpenAIConfigurationError as exc:
|
except OpenAIConfigurationError as exc:
|
||||||
|
add_log(f'AI configuration error: {exc}')
|
||||||
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
||||||
|
|
||||||
|
add_log('AI task completed')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True,
|
'success': True,
|
||||||
'model': result['model'],
|
'model': result['model'],
|
||||||
@@ -128,8 +140,12 @@ async def analyze_project(payload: ProjectAnalyzeRequest):
|
|||||||
if not repo_url.startswith('http'):
|
if not repo_url.startswith('http'):
|
||||||
raise HTTPException(status_code=400, detail='Invalid repository URL')
|
raise HTTPException(status_code=400, detail='Invalid repository URL')
|
||||||
|
|
||||||
|
add_log(f'Analyzing project: {repo_url}')
|
||||||
|
|
||||||
analysis = analyze_github_project(repo_url)
|
analysis = analyze_github_project(repo_url)
|
||||||
|
|
||||||
|
add_log(f'Project analyzed: {analysis.stack}')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True,
|
'success': True,
|
||||||
'analysis': analysis.to_dict(),
|
'analysis': analysis.to_dict(),
|
||||||
@@ -142,9 +158,14 @@ async def install_dependencies(payload: ProjectAnalyzeRequest):
|
|||||||
|
|
||||||
outputs = []
|
outputs = []
|
||||||
|
|
||||||
|
add_log('Installing dependencies')
|
||||||
|
|
||||||
for step in analysis.dependency_steps:
|
for step in analysis.dependency_steps:
|
||||||
|
add_log(f'Running: {step.command}')
|
||||||
outputs.append(run_command(step.command, step.cwd, 1800))
|
outputs.append(run_command(step.command, step.cwd, 1800))
|
||||||
|
|
||||||
|
add_log('Dependencies installed')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True,
|
'success': True,
|
||||||
'analysis': analysis.to_dict(),
|
'analysis': analysis.to_dict(),
|
||||||
@@ -154,14 +175,19 @@ async def install_dependencies(payload: ProjectAnalyzeRequest):
|
|||||||
|
|
||||||
@app.post('/api/android/devices')
|
@app.post('/api/android/devices')
|
||||||
async def android_devices():
|
async def android_devices():
|
||||||
|
add_log('Refreshing Android devices')
|
||||||
return list_devices()
|
return list_devices()
|
||||||
|
|
||||||
|
|
||||||
@app.post('/api/android/build')
|
@app.post('/api/android/build')
|
||||||
async def android_build(payload: WorkspaceRequest):
|
async def android_build(payload: WorkspaceRequest):
|
||||||
|
add_log(f'Android build started: {payload.workspace}')
|
||||||
|
|
||||||
result = build_android(payload.workspace)
|
result = build_android(payload.workspace)
|
||||||
apks = find_apks(payload.workspace)
|
apks = find_apks(payload.workspace)
|
||||||
|
|
||||||
|
add_log('Android build completed')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': result['returncode'] == 0,
|
'success': result['returncode'] == 0,
|
||||||
'result': result,
|
'result': result,
|
||||||
@@ -171,8 +197,12 @@ async def android_build(payload: WorkspaceRequest):
|
|||||||
|
|
||||||
@app.post('/api/android/install-latest')
|
@app.post('/api/android/install-latest')
|
||||||
async def android_install_latest(payload: WorkspaceRequest):
|
async def android_install_latest(payload: WorkspaceRequest):
|
||||||
|
add_log(f'Installing APK to device: {payload.device}')
|
||||||
|
|
||||||
result = install_latest_apk(payload.workspace)
|
result = install_latest_apk(payload.workspace)
|
||||||
|
|
||||||
|
add_log('APK installation completed')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': result['returncode'] == 0,
|
'success': result['returncode'] == 0,
|
||||||
'result': result,
|
'result': result,
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user