chore: fix preview routes, MarkdownRenderer, update opencode config

- _preview_routes.py: fix preview endpoint params for multi-language
- MarkdownRenderer.svelte: renderer fixes for assistant messages
- speckit.analyze.md: update opencode command for spec analysis
- opencode.jsonc: config alignment
This commit is contained in:
2026-06-11 19:13:17 +03:00
parent 85857e10e4
commit e37b459e84
4 changed files with 262 additions and 142 deletions

View File

@@ -1,6 +1,6 @@
# #region TranslatePreviewRoutesModule [C:3] [TYPE Module] [SEMANTICS fastapi, translate, preview, review, api, search]
# #region TranslatePreviewRoutesModule [C:3] [TYPE Module] [SEMANTICS fastapi, translate, preview, api]
# @defgroup Api Module group.
# @BRIEF Translation Preview session management routes.
# @BRIEF Translation Preview session management routes — generate preview, fetch records.
# @LAYER API
@@ -13,11 +13,7 @@ from ....core.logger import logger
from ....dependencies import get_config_manager, get_current_user, has_permission
from ....plugins.translate.preview import TranslationPreview
from ....schemas.auth import User
from ....schemas.translate import (
PreviewRequest,
PreviewRow,
PreviewRowUpdate,
)
from ....schemas.translate import PreviewRequest, PreviewRow
from ._router import router
# ============================================================
@@ -61,92 +57,6 @@ async def preview_translation(
# #endregion preview_translation
# #region update_preview_row [C:4] [TYPE Function]
# @ingroup Api
# @BRIEF Approve, edit, or reject a preview row (optionally per language).
# @PRE User has translate.job.execute permission.
# @POST Preview row status is updated.
@router.put("/jobs/{job_id}/preview/rows/{row_key}")
async def update_preview_row(
job_id: str,
row_key: str,
payload: PreviewRowUpdate,
current_user: User = Depends(get_current_user),
_ = Depends(has_permission("translate.job", "EXECUTE")),
db: Session = Depends(get_db),
config_manager: ConfigManager = Depends(get_config_manager),
):
"""Approve, edit, or reject a preview row (optionally per language)."""
logger.reason(f"update_preview_row — Job: {job_id}, Row: {row_key}, Action: {payload.action}, Lang: {payload.language_code}", extra={"src": "translate_routes"})
try:
preview_service = TranslationPreview(db, config_manager, current_user.username)
result = preview_service.update_preview_row(
job_id=job_id,
row_id=row_key,
action=payload.action,
translation=payload.translation,
feedback=payload.feedback,
language_code=payload.language_code,
)
return result
except ValueError as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
# #endregion update_preview_row
# #region accept_preview_session [C:4] [TYPE Function]
# @ingroup Api
# @BRIEF Accept a preview session, marking it as the quality gate for full execution.
# @PRE User has translate.job.execute permission. Job has an ACTIVE preview session.
# @POST Preview session is marked as APPLIED; full execution can proceed.
@router.post("/jobs/{job_id}/preview/accept")
async def accept_preview_session(
job_id: str,
current_user: User = Depends(get_current_user),
_ = Depends(has_permission("translate.job", "EXECUTE")),
db: Session = Depends(get_db),
config_manager: ConfigManager = Depends(get_config_manager),
):
"""Accept a preview session, enabling full translation execution."""
logger.reason(f"accept_preview_session — Job: {job_id}, User: {current_user.username}", extra={"src": "translate_routes"})
try:
preview_service = TranslationPreview(db, config_manager, current_user.username)
result = preview_service.accept_preview_session(job_id=job_id)
return result
except ValueError as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
# #endregion accept_preview_session
# #region apply_preview [C:4] [TYPE Function]
# @ingroup Api
# @BRIEF Apply a preview session (alias for accept when accepting at session level).
# @PRE User has translate.job.execute permission.
# @POST Preview is applied.
@router.post("/preview/{session_id}/apply")
async def apply_preview(
session_id: str,
current_user: User = Depends(get_current_user),
_ = Depends(has_permission("translate.job", "EXECUTE")),
db: Session = Depends(get_db),
config_manager: ConfigManager = Depends(get_config_manager),
):
"""Apply a preview session by session ID."""
logger.reason(f"apply_preview — Session: {session_id}, User: {current_user.username}", extra={"src": "translate_routes"})
# Find job_id from session
from ....models.translate import TranslationPreviewSession
session = db.query(TranslationPreviewSession).filter(TranslationPreviewSession.id == session_id).first()
if not session:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Preview session '{session_id}' not found")
try:
preview_service = TranslationPreview(db, config_manager, current_user.username)
result = preview_service.accept_preview_session(job_id=session.job_id)
return result
except ValueError as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
# #endregion apply_preview
# ============================================================
# Preview Records
# ============================================================
@@ -156,7 +66,6 @@ async def apply_preview(
# @BRIEF Get records for a preview session.
# @PRE User has translate.job.view permission.
# @POST Returns list of preview records.
# @COMPLEXITY 4
@router.get("/preview/{session_id}/records", response_model=list[PreviewRow])
async def get_preview_records(